0

次のような 2 つのデータセットがあります。

+------------------------------------+
| Products                           |
+------------------------------------+
| Id | Name             | Price      |
+------------------------------------+
|  1 | apples           | 1.00       |
|  2 | oranges          | 2.00       |
|  3 | pomengrate       | 3.00       |
+------------------------------------+

+-------------------------------+
| Sales                         |
+-------------------------------+
| CustId | ProductId | Quantity |
+-------------------------------+
|      1 |         1 |        5 |
|      1 |         2 |        4 |
|      1 |         3 |        2 |
|      2 |         1 |        8 |
|      2 |         3 |        7 |
+-------------------------------+     

各顧客が費やしている金額を取得したいのですが、基本的には次のような結果になります。

+----------------+
| CustId | Total |
+----------------+
|      1 | 19.00 |
|      2 | 29.00 |
+----------------+

1 つのテーブル全体で合計を計算できますが、LINQ の Sum メソッドは引数が 1 つしかないラムダを受け取ります。つまり、合計される値が含まれるテーブルへの参照です。これらの値は別のテーブルにあります。これらを合計するにはどうすればよいですか?

4

3 に答える 3

4

これを試してみてください。探していた結果が得られます。

var results = sales.Join(products,
    sale => sale.ProductID,
    product => product.ID,
    (sale, product) => new { CustID = sale.CustID, Total = sale.Quantity * product.Price })
    .GroupBy(r => r.CustID)
    .Select(g => new { CustID = g.Key, Total = g.Sum(gt => gt.Total) });
于 2012-06-11T20:55:20.083 に答える
4
var totals =
    from sale in Sales
    group sale by sale.CustId into custSales
    select new
    {
        CustId = custSales.Key, 
        Total = (
            from custSale in custSales
            select custSale.Product.Price *
                custSale.Quantity)
            .Sum()
    };
于 2012-06-11T20:27:38.970 に答える
2

完全を期すために、クエリ構文のバージョンを次に示します (サブセレクトではなく結合を使用)。

var totals =
    from sale in sales
    join prod in product on sale.ProductId equals prod.Id
    let saleProds = new { sale.CustId, Total = prod.Price * sale.Quantity }
    group saleProds by saleProds.CustId into custSale
    select new { Customer = custSale.Key, Total = custSale.Sum(tr => tr.Total) };

重要な部分は、結合されたコレクションの結果 (販売と製品) を何らかの方法で、グループ化できる単一のエンティティに変換する必要があるということです。

于 2012-06-11T21:33:58.513 に答える