linq'group by'选择一些符合最大标准的实体

时间:2017-05-22 10:20:49

标签: c# linq

如果我为多个实体返回了许多审核记录,并且我希望 - 以尽可能干净和高效的方式将此列表缩减为每个实体的最新版本,我该怎么做?

例如我有

Id, version, data 
1, 1, abc
1, 2, def
1, 3, ghi
2, 1, abc
3, 1, abc 
3, 2, def

我希望查询返回三个行实体,ID 1的版本3,ID 2的版本1和ID 3的版本2.我不想知道最大值,我需要能够实际选择行实体本身

var latestVersions = auditEntries.GroupBy(a => a.id).Select(g => ???)

2 个答案:

答案 0 :(得分:1)

你正朝着正确的方向前进。对于每个组version,您需要通过降序var latestVersions = auditEntries.GroupBy(a => a.id) .Select(g => g.OrderByDescending(i => i.version).First()); 对每个实体进行排序,然后获取每个组的第一个实体。

after

答案 1 :(得分:0)

不确定哪个是最快的,时间20000个对象显示两种方法的大致相同的时间,但我不想依靠GroupBy来保留顺序,所以如何使用Max:< / p>

var ans = src.GroupBy(r => r.Id).SelectMany(rg => rg.Where(r => r.version == rg.Max(r2 => r2.version)));

如果您正在使用LINQ to SQL之类的东西,那么查看SQL Translation可能会更有成效。

您也可以使用群组上的OrderByDescending代替Max,但对象的时间似乎大致相同:

var ans2 = src.GroupBy(r => r.Id).Select(rg => rg.OrderByDescending(r => r.version).First());