2011-08-03 13 views
1

私は3列のリストビューコントロールを持っています:linq to sql、集計列、日付順のリストビュー

年| NetTotal | GrossTotal

また、私はいくつかの列を持つ注文と呼ばれるテーブルを持っています、彼らは注文に関する情報を含み、彼らが所属する顧客のIDを格納します。

質問:どのようにLinq(datacontextはLinqToSqlからのものです)を使ってそのテーブルをクエリして、次のデータを返すことができますか?

CustomerIDが一致するエントリを検索し、年単位でグループ化し、合計を合計してリストビューに追加したいとしますか?私は今、私はどのように、ラムダ式や集計を使用してだけでは明らかではない可能性があり(DBはDataContextのオブジェクトであり、オプションがオン推測、得意先がint32型変数である)

Dim Orders = (From order In db.Orders Where order.CustomerID = CustomerID).GroupBy(Function(p) p.Date.Year).GetEnumerator 

私は私が持っているだろう数えます次のように匿名型を作成するには:

Dim tmpYears = From prevs In db.Orders Select New With {.CustID = prevs.CustomerID, .Year = prevs.PaymentDate.Year, .NetPurchase, .GrossPurchase} 

をしかし、どのように、私は、グループ内の購入の列を集計していますか?

Dim CustomerOrders = From ord In db.Orders Where Ord.CustomerID = custID Select ord 
Dim tot = From O in CustomerOrders Select Aggregate netTot In O Into Sum(netTot.Price * netTot.Quantity * 1+ (netTot.Discount/100)) 

私は2つをマージしたい。

提案がありますか? (私はthisを読んだことがありますが、私はLinqでチームプロジェクトを作っていましたので、LinqToSQLソリューションをdb.Alsoに送信する代わりにLinqを使用することに同意しました。それ)

答えて

1

私はあなたの要求を正確に理解することは保証できませんが、注文は表示されていて、年ごとにグループ化され、総額/総額の総額が表示されます。 ?これは私が記載されている要件に従って人口YearNetTotal、およびGrossTotalであなたに匿名型を提供する必要があります

Dim results = db.Orders.Where(Function(n) n.CustomerId = customerId).GroupBy(Function(n) n.Date.Year, Function(key, values) New With {.Year = key, .NetTotal = values.Sum(Function(n) n.NetPurchase * n.Quantity * (1 + (n.Discount/100))), .GrossTotal = values.Sum(Function(n) n.GrossPurchase)}) 

構文が、私は、このフリーハンドをやって少し出ている場合

申し訳ありませんが...。

EDIT:1つのライナーにもお詫び申し上げますが、私はあなたがそれを味に再フォーマットできると確信しています。

+0

感謝、感謝、私もonelinersが好き;) – Qqbt

+0

私は大ファンでも、ワンライナーが悪いニュースであることを知っています。あなたの質問へのトリックは 'GroupBy'の過負荷でしたが、おそらくあなたはそれを今目にしたでしょう。私は 'resultSelector'を持っているオーバーロードを使用しています。これは、1つのライナーになると、すべてのオプションの中から私が好きなものです。 :-) – Smudge202

+0

あなたは正しいですし、これの最良の部分(ほとんどのlinqクエリのように)は結果が列挙可能です....人生はITの土地で素晴らしい...時には素晴らしい答えに感謝します – Qqbt