然后LINQ组按顺序排序组

Ket*_*hup 18 .net c# linq entity-framework

我有一个表有以下3列,ID,ShortCode,UploadDate.

我想使用LINQ通过shortcode对结果进行分组(并保留所有结果),然后对这些组进行排序并返回一个列表.

我有以下内容:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()
Run Code Online (Sandbox Code Playgroud)

我想返回所有结果,按ShortCode分组,每个组中的项目按UploadDate排序,组排序,以便首先包含最新文档.

有谁知道这是否可能?

Raw*_*ing 40

尝试

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .OrderByDescending(d => d.UploadDate)
    .GroupBy(d => d.ShortCode)
    .SelectMany(g => g)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

这应该

  • 按上传日期订购商品(先下降最新)
  • 然后用短代码对它们进行分组 - 因此在每个组中,项目仍然是有序的
  • 这些组仍然按降序排列,因此无需再次订购
  • 最后将结果连接成一个列表

如果性能是一个问题,那么你可以做得更好

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .GroupBy(d => d.ShortCode)
    .Select(g => g.OrderByDescending(d => d.UploadDate))
    .OrderByDescending(e => e.First().UploadDate)
    .SelectMany(e => e)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

它分别对每个组的内容进行排序,而不是先对所有内容进行排序,然后再进行分组.

  • @AnshulNigam您可能想要删除`SelectMany`行,这就是将组变为单个序列的原因.第二个`ToList`,或者至少删除`<PDFDocument>`类型参数.你会想要使用第一个查询,而不是第二个查询. (2认同)

Fal*_*nwe 5

实际上,您不希望按短代码分组,您希望按它们排序.所以以下查询应该做的伎俩:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.OrderBy(b => b.ShortCode)
.ThenBy(b => b.UploadDate)
.ToList()
Run Code Online (Sandbox Code Playgroud)

编辑 如果您真的想使用GroupBy,可以这样做:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate))
.ToList()
Run Code Online (Sandbox Code Playgroud)

但我劝阻它.如果你不想要团体,那就没有必要创建团体了!

第二次编辑

我没有让你想要UpdateTime订购的团体.它使查询复杂化了一些:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.Select(grouping => grouping.OrderByDescending(b => b.UploadDate))
.OrderByDescending(grouping => grouping.First().UploadDate)
.SelectMany(grouping => grouping)
.ToList()
Run Code Online (Sandbox Code Playgroud)