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

我有以下带有IDContactIdComment的简单表。

在此处输入图像描述

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

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

它返回记录14 。 如何使用LINQ获取具有最高IDContactID ? (即返回36

你可以订购你的物品

 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();