如何在LINQ GroupBy子句中选择最后一条记录
我有以下带有ID , ContactId和Comment的简单表。
我想选择记录和GroupBy contactId
。 我使用了这个LINQ
扩展方法语句:
Mains.GroupBy(l => l.ContactID) .Select(g => g.FirstOrDefault()) .ToList()
它返回记录1
和4
。 如何使用LINQ
获取具有最高ID
的ContactID
? (即返回3
和6
)
你可以订购你的物品
Mains.GroupBy(l => l.ContactID) .Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) .ToList()
对组中的项使用OrderByDescending
:
Mains.GroupBy(l => l.ContactID) .Select(g => g.OrderByDescending(l => l.ID).First()) .ToList();
此外,从组中选择项目时不需要FirstOrDefault
; 一个组将始终至少有一个项目,以便您可以安全地使用First()
。
也许选择使用Max
而不是OrderByDescending
可以提高性能(我不确定它是如何制作的,因此需要进行测试):
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
。
如果我不对,请随意纠正我。
OrderByDescending
Mains.GroupBy(l => l.ContactID) .Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) .ToList()
是你最好的解决方案
它以最高ID递减排序,这从名称中非常明显。
您可以像这样使用MoreLinq来获得更短的解决方案:
Main.OrderByDescending(i => i.Id).DistinctBy(l => l.ContactID).ToList();