Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ group by然后对结果的组进行排序_C#_.net_Linq_Entity Framework - Fatal编程技术网

C# LINQ group by然后对结果的组进行排序

C# LINQ group by然后对结果的组进行排序,c#,.net,linq,entity-framework,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<P

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

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

我有以下资料:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()
rawData.Provider.CreateQuery(qb.rootExpression)
.ToList()。
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList()
我想返回所有结果,按快捷码分组,每组中的项目按UploadDate排序,组排序,首先是包含最新文档的组


有人知道这是否可行吗?

事实上,您不想按短代码分组,而是想按他们排序。因此,下面的查询应该可以做到这一点:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.OrderBy(b => b.ShortCode)
.ThenBy(b => b.UploadDate)
.ToList()
rawData.Provider.CreateQuery(qb.rootExpression)
托利斯先生()
.OrderBy(b=>b.ShortCode)
.ThenBy(b=>b.UploadDate)
托利斯先生()
编辑 如果您确实想使用GroupBy,可以通过以下方式:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate))
.ToList()
rawData.Provider.CreateQuery(qb.rootExpression)
托利斯先生()
.GroupBy(b=>b.ShortCode)
.SelectMany(grouping=>grouping.OrderBy(b=>b.UploadDate))
托利斯先生()
但我不鼓励这样做。如果你一开始就不想要群组,那么创建群组是没有意义的

第二次编辑

我没有得到你想要的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()
rawData.Provider.CreateQuery(qb.rootExpression)
托利斯先生()
.GroupBy(b=>b.ShortCode)
.Select(grouping=>grouping.OrderByDescending(b=>b.UploadDate))
.OrderByDescending(分组=>grouping.First().UploadDate)
.SelectMany(分组=>grouping)
托利斯先生()
试试看

rawData.Provider.CreateQuery(qb.rootExpression)
.可计算的()
.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();
rawData.Provider.CreateQuery(qb.rootExpression)
.可计算的()
.GroupBy(d=>d.ShortCode)
.Select(g=>g.OrderByDescending(d=>d.UploadDate))
.OrderByDescending(e=>e.First().UploadDate)
.SelectMany(e=>e)
.ToList();

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

这会按日期对组中的两个元素进行排序吗?然后还要对分组的结果进行排序?具有第一个短代码的所有元素将首先在结果列表中,按UpdateTime排序,然后是具有第二个短代码的所有元素,顺序相同,依此类推。结果将类似于您在excel中获得的结果,当您主要按一列,然后按另一列排序元素时。对不起,我没有正确理解您的要求。我认为这些组应该按短代码排序,而不是按最新元素的更新日期排序。我将使用另一个响应此要求的查询进行编辑。谢谢,这确实符合我的要求,但rawlign首先进入了那里。谢谢,这正是我想要的。我想知道放置“OrderBy”+“GroupBy”+“OrderBy”的顺序,这完美地回答了它。这是返回给我的列表类型的实体,但我希望它是group类型,我得到的编译器错误是无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(是否缺少转换?@AnshulNigam您可能希望删除
SelectMany
行,这就是将组展平为单个序列的原因。和第二个
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();