LINQ:获取具有给定属性的最大值的行

时间:2009-12-18 07:54:25

标签: c# asp.net linq linq-to-sql

我在一个名为MyID的属性上分组了一堆行。现在,我希望每个组中的一行StatusDate属性在该组中最高。

这就是我想出来的。

rows.Select(x => x.Where(y => y.StatusDate == x.Max(z => z.StatusDate)).First())

稍作解释一下:

rows.Select(x => // x is a group
  x.Where(y => // get all rows in that group where...
               // the status date is equal to the largest
               // status date in the group
    y.StatusDate == x.Max(z => z.StatusDate)
  ).First()) // and then get the first one of those rows

有没有更快或更惯用的方法呢?

2 个答案:

答案 0 :(得分:15)

另一种选择是使用:

rows.Select(x => x.OrderByDescending(y => y.StatusDate).First());

...并检查查询优化器是否知道确实需要对所有内容进行排序。 (这在LINQ to Objects中会是灾难性的,但在这种情况下你可以使用MoreLINQ中的MaxBy:)

(先前版本的道歉 - 我还没有完全理解分组位。)

答案 1 :(得分:0)

不知道这是否是Linq to SQL,但如果是,你可以通过SQL中的rank()函数完成(按日期对每个组进行排名,然后从每个组中选择第一个排名的行),然后调用这是LINQ的存储过程。我认为,当人们遇到LINQ2SQL的bounderies时,这种习惯变得越来越惯用......