【问题标题】:LINQ group by then order groups of resultLINQ 组然后对结果组进行排序
【发布时间】:2012-05-10 09:08:12
【问题描述】:

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

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

我有以下几点:

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

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

有人知道这是否可能吗?

【问题讨论】:

    标签: c# .net linq entity-framework


    【解决方案1】:

    试试

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

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

    【讨论】:

    • 谢谢,这正是我想要的。
    • 我想知道放置“OrderBy”+“GroupBy”+“OrderBy”的顺序,这完美地回答了它
    • 这返回给我 List 类型的实体,但我希望它是 group 类型,我得到的编译器错误是无法隐式地将类型 'System.Collections.Generic.List' 转换为'System.Collections.Generic.IEnumerable>'。存在显式转换(您是否缺少演员表?)
    • @AnshulNigam 您可能想要删除SelectMany 行,这就是将组扁平化为单个序列的原因。第二个ToList,或者至少去掉&lt;PDFDocument&gt; 类型参数。你会想使用第一个查询,而不是第二个。
    • 谢谢。这个其实是我需要的。
    【解决方案2】:

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

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

    【讨论】:

    • 这是否会按日期对组内的两个元素进行排序?然后还要对分组结果排序?
    • 所有具有第一个 ShortCode 的元素将首先出现在结果列表中,按 UpdateTime 排序,然后是具有第二个 ShortCode 的所有元素,同样排序,依此类推。结果将类似于您在 excel 中获得的结果,当您主要按列排序元素时,然后按另一列。
    • 对不起,我没有正确理解您的要求。我认为这些组应该按 ShortCode 而不是按其最新元素的 UpdateDate 排序。我将使用另一个响应此要求的查询进行编辑。
    • 谢谢,这确实符合我的要求,但 rawlign 先进入了那里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多