我在一个名为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
有没有更快或更惯用的方法呢?
答案 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时,这种习惯变得越来越惯用......