我有一个包含以下3列的表,ID,ShortCode,UploadDate。
我想使用LINQ通过短代码对结果进行分组(并保留所有结果),然后对这些组进行排序并返回一个列表。
我有以下内容:
rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()
我希望返回所有结果,按ShortCode分组,每个组中的项目按UploadDate排序,组排序的那些首先包含最新文档的组。
有人知道这是否可能吗?
答案 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()