由Max无法工作的Linq分组

时间:2011-12-22 16:30:15

标签: c# asp.net 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个结果。 谢谢

2 个答案:

答案 0 :(得分: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验证。

答案 1 :(得分: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     })