【问题标题】:Sorting output from Linq with group by使用 group by 对 Linq 的输出进行排序
【发布时间】:2011-11-17 16:40:17
【问题描述】:

下面的 linq 查询未返回按序列字段按降序排列的结果。而是返回结果而不考虑 orderby:

var qr = from l in reports.layouts
    where l.job == jobNumber
    orderby l.sequence descending
    group l by l.filename;

但是下面的代码能够返回按文件名字段分组的结果,并按序列字段降序排列:

var qr = reports.layouts
   .Where(l => l.job == jobNumber)
   .OrderBy(l => l.filename)
   .GroupBy(l => l.filename, (l, c) => c.OrderByDescending(x => x.sequence));

谁能提供有关如何编写第一个查询以按所需降序返回结果的任何见解?

【问题讨论】:

    标签: linq sorting group-by


    【解决方案1】:

    分组会破坏订单。你的两个查询不一样。

    第一个翻译成更像:

    var qr = reports.layouts
       .Where(l => l.job == jobNumber)
       .OrderByDescending(l => l.sequence)
       .GroupBy(l => l.filename);
    

    由于 GroupBy 发生在排序之后,它有效地破坏了排序。

    就个人而言,这是我发现您使用的方法链语法在意图方面比等效查询语法更清晰的一种情况。

    【讨论】:

    • @DavidB:LINQ to Objects 确实如此,但不一定是其他 LINQ 源。请参阅 Queryable.GroupBy 的文档,并注意未指定:msdn.microsoft.com/en-us/library/bb549270.aspx
    • 当然可以。 OP 没有指定什么查询源。因为它不是 DataContext 或 ObjectContext 或 DBContext,所以我假设是 LinqToObjects。你是对的 - 这是一个假设。
    • 感谢您帮助我了解发生了什么。
    【解决方案2】:
    var qr =
      from l in reports.layouts
      where l.job == jobNumber
      group l by l.filename into g
      orderby g.Key descending
      select
        from x in g
        orderby x.sequence descending
        select x;
    

    【讨论】:

    • David B -- 感谢您提供代码示例。它当然可以帮助我理解使查询在查询语法与方法语法中工作所必需的。
    猜你喜欢
    • 2018-09-11
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多