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()
。g => g.OrderBy(l => l.ID).Last()
:) - Mr. Blond也许使用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();
var lastCommentIDs = Mains.GroupBy(k => k.ContactID, e => e.ID, (k, e) => new { k, lastID = e.Max(x => x)}); var result = lastCommentIDs.Join(Mains, o => o.lastID, i => i.ID, (o, i) => new { ContactID = o.k, LastComment = i.Comment).ToList();
- Dmytro