25

我有一个包含以下 3 列的表,ID、ShortCode、UploadDate。

我想使用 LINQ 按短代码对结果进行分组(并保留所有结果),然后对这些组进行排序并返回一个列表。

我有以下内容:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()

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

有谁知道这是否可能?

4

2 回答 2

59

尝试

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

这应该

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

如果性能是一个问题,你最好做

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();

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

于 2012-05-10T09:27:27.127 回答
7

事实上,你不想按短代码分组,你想按它们排序。因此,以下查询应该可以解决问题:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.OrderBy(b => b.ShortCode)
.ThenBy(b => b.UploadDate)
.ToList()

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

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

但我不鼓励它。如果您一开始就不想组,那么创建组是没有意义的!

第二次编辑

我也没有让您想要 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()
于 2012-05-10T09:17:48.677 回答