如何选择LINQ GroupBy子句中的最后一条记录

时间:2016-07-11 10:30:29

标签: c# linq

我有以下简单的表格,其中包含 ID ContactId 评论

enter image description here

我想选择记录和GroupBy contactId。我使用了这个LINQ扩展方法语句:

Mains.GroupBy(l => l.ContactID)
 .Select(g => g.FirstOrDefault())
 .ToList()

返回记录14。如何使用LINQ获取ContactID最高的ID? (即返回36

5 个答案:

答案 0 :(得分:21)

您可以订购商品

ROW_NUMBER()

答案 1 :(得分:6)

对组中的项目使用OrderByDescending

Mains.GroupBy(l => l.ContactID)
    .Select(g => g.OrderByDescending(l => l.ID).First())
    .ToList();

此外,从组中选择项目时不需要FirstOrDefault;一个小组将始终至少有一个项目,以便您可以安全地使用First()

答案 2 :(得分:4)

或许选择Max代替OrderByDescending可能会提高性能(我不确定它是如何制作的,因此需要进行测试):< / p>

var grouped = Mains.GroupBy(l => l.ContactID);
var ids = grouped.Select(g => g.Max(x => x.Id));
var result = grouped.Where(g => ids.Contains(g.Id));

我认为这可能导致查询需要MAX然后执行SELECT * FROM ... WHERE id IN ({max ids here}),这可能明显快于OrderByDescending

如果我不对,请随意纠正我。

答案 3 :(得分:1)

OrderByDescending

Mains.GroupBy(l => l.ContactID)
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList()

是您最好的解决方案

按最高ID降序排序,从名称中可以看出这一点。

答案 4 :(得分:0)

您可以像这样使用MoreLinq来获得更短的解决方案:

Main.OrderByDescending(i => i.Id).DistinctBy(l => l.ContactID).ToList();