我有以下简单的表格,其中包含 ID , ContactId 和评论。
我想选择记录和GroupBy contactId
。我使用了这个LINQ
扩展方法语句:
Mains.GroupBy(l => l.ContactID)
.Select(g => g.FirstOrDefault())
.ToList()
返回记录1
和4
。如何使用LINQ
获取ContactID
最高的ID
? (即返回3
和6
)
答案 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();