簡體   English   中英

如何優化linq進行分組和排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM