2011-12-22 56 views
1

我有產品Linq的分組由Max不工作

Id | Name  | Order 
1 | product 1 | 5 
1 | product 1 | 9 
1 | product 1 | 2 
2 | product 2 | 0 
3 | product 3 | 1 

我需要用最大的訂單號碼僅返回產品表:

Id | Name  | Order 

1 | product 1 | 9 
2 | product 2 | 0 
3 | product 3 | 1 

試過,但它不工作:

var items = (from i in db.products 
       group i by new 
       { 
        i.Id, 
        i.Name, 
        i.Order 
       } into g 

       select new 
       { 
        g.Key.Id, 
        g.Key.Name, 
        Order = g.Where(d => d.Order == g.Max(xx => xx.Order)).First().Order  }) 

但它仍然返回所有5個結果。 謝謝

回答

3

變化

   group i by new 
      { 
       i.Id, 
       i.Name, 
       i.Order 
      } into g 

   group i by new 
      { 
       i.Id, 
       i.Name, 
      } into g 

我想我也重寫最後表達

Order = g.OrderByDescending(xx => xx.Order).First().Order 

主要是因爲我覺得這是更容易閱讀,但生成的SQL也可能更高效。但這只是一個趣味問題,可以使用SQL Profiler來驗證任何性能差異。

+0

甚至只是ID? – Rawling 2011-12-22 16:33:00

+0

@Rawling,然後你需要通過'g.First()。Name'來獲取名字,這會轉化爲更糟糕的SQL(假設'db.products'使用LINQ2SQL)。 – 2011-12-22 16:38:25

+0

夠公平的,我對此有點朦朧。這就是爲什麼我們要創建一個新項目來選擇,而不是從組中選擇一個現有項目? – Rawling 2011-12-22 16:44:26

0

你仍然有5行的原因是因爲組合的順序對你的組是不同的。如果您想使用原始查詢,或者使用訂單來獲取最大訂單,這將是查詢。

var items = (from i in db.products 
       group i by new 
       { 
        i.Id, 
        i.Name      
       } into g 

       select new 
       { 
        g.Key.Id, 
        g.Key.Name, 
        Order = g.Where(d => d.Order == g.Max(xx => xx.Order)).First().Order  })