然后LINQ组按顺序排序组

时间:2012-05-10 09:08:12

标签: c# .net linq entity-framework

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

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

我有以下内容:

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

我希望返回所有结果,按ShortCode分组,每个组中的项目按UploadDate排序,组排序的那些首先包含最新文档的组。

有人知道这是否可能吗?

2 个答案:

答案 0 :(得分:38)

尝试

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

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

答案 1 :(得分:5)

实际上,您不希望按短代码分组,您希望按它们排序。因此,以下查询应该可以解决这个问题:

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