[英]How to optimize linq for grouping and sorting
我搜索了檔案,但是找不到解決方案。 我正在嘗試按UniqueId將實體集合進行分組,然后按RevisionNumber排序,並為每個UniqueId返回具有最高RevisionNumber的實體。
因此,對於示例數據,
[UniqueId, RevisionNumber]
[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 1]
[2, 2]
[2, 3]
結果集合將返回
[1, 4]
[2, 3]
是否有人看到如何將下面的兩個語句組合成一個linq查詢,該查詢對集合進行排序,分組並為每個唯一ID的最高修訂版本返回投影的DTO對象?
謝謝!
private static IEnumerable<RevisionDto> ExtractHighestRevisions(IEnumerable<RevisionEntity> revisions)
{
var groupedRevisions = (from r in revisions
orderby r.RevisionNumber descending
group r by r.UniqueId
into grp
select grp.OrderByDescending(g => g.RevisionNumber).FirstOrDefault());
return (from r in groupedRevisions
orderby r.RevisionNumber
select new RevisionDto
{
// other properties omitted for clarity
UniqueId = r.UniqueId,
RevisionNumber = r.RevisionNumber
});
}
我被騙了一點,使用的MaxBy
從運營商morelinq :
return revisions
.GroupBy(r => r.UniqueID)
.SelectMany(g => g.MaxBy(r => r.RevisionNumber))
.Select(r =>
new RevisionDto
{
UniqueId = r.UniqueId,
RevisionNumber = r.RevisionNumber
})
.OrderBy(r => r.RevisionNumber);
我認為您可以使用以下方法執行此操作:
var q = from r in revisions
group r by r.UniqueId into grouped
select new ReveisonDto
{
UniqueId = grouped.Key,
RevisionNumber = grouped.Max(x => x.RevisionNumber)
};
但是顯然,如果您實際上想獲取原始對象而不是Dto,則此方法將無效
如果您詢問是否有一種將兩個查詢組合的方法,那么這是一種幼稚的方法:
return from r in revisions
orderby r.RevisionNumber descending
group r by r.UniqueId
into grp
select grp.OrderByDescending(g => g.RevisionNumber).FirstOrDefault() into groupedRevisions
from r in groupedRevisions
orderby r.RevisionNumber
select new RevisionDto
{
// other properties omitted for clarity
UniqueId = r.UniqueId,
RevisionNumber = r.RevisionNumber
};
但是我只是這樣重寫它:
return from r in revisions
orderby r.RevisionNumber
group r by r.UniqueId
into grp
let r = grp.Last()
select new RevisionDto
{
// other properties omitted for clarity
UniqueId = r.UniqueId,
RevisionNumber = r.RevisionNumber
};
您肯定會以任何方式瀏覽整個收藏集,因此您最好進行一次排序並獲得組中的最后一項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.