2012-06-11 54 views
0

我有兩個數據集看起來像這樣的:LINQ查詢和產品跨多個集合

+------------------------------------+ 
| 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 | 
+----------------+ 

我可以做的總和在單個表中,但在LINQ求和方法採用的λ與只有一個參數:所述參考表所總結的值是在這些值是在不同的表。我如何將這些總結在一起?

+2

LINQ一般與數據庫無關。你在用什麼ORM? (LINQ2SQL?) – Cameron

+0

是linqtosql,但據我所知LINQ的語法應該是相同的它是否是一個數據庫中讀取或者產品和銷售是被如上構造 –

+0

@Cameron對象的集合,您的評論並不涉及他的問題在任何方面。 –

回答

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) }; 

的關鍵部分是,你需要以某種方式將加入的收集結果(銷售和促銷)轉換爲一個單一的實體,然後可以將其分組。

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() 
    }; 
+3

數量*價格,也許? –

+0

@RaphaëlAlthaus:啊,是的,你說得對。更新。 – Steven

+0

這隻會給我客戶購買的物品總數,而不是客戶花費的金額 –

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) }); 
+0

那一個工作。 +1 ...不能讓我的查詢語法方法工作,現在可能已經晚了 –