【问题标题】:Order Subgrouping in Linq QueryLinq 查询中的订单子分组
【发布时间】:2013-06-08 01:26:37
【问题描述】:

我的 Linq 查询有问题。我有一个格式如下的查询,它返回一个按顶级分组并按字母顺序排列的顶级字符串的结果集。我想返回一个按顶级字符串排序的结果集(因此 group by 子句按字母顺序排序)和子级别字符串也按字母顺序排列(因此每个子组也按字母顺序排列)。我期待的是如下内容:

  • 一个
    • 一个
    • B
    • C
    • 一个
    • B
    • C

我的查询类似于以下内容:

records.results
       .Where(table => string.Compare(table, expected) == 0)
       .OrderByDescending(table => table.name)
       .GroupBy(table => table.name);
       .OrderBy(group => group.Key);

我希望 OrderByDescending 语句能够更改 groupby 子句中各个记录的顺序,但它不会产生任何影响。不过,我收到了组的有序结果。任何帮助表示赞赏!

【问题讨论】:

  • 我猜.OrderBy(group => group.Key);应该是.Select(g=>g.OrderBy(x=>x.SomeProp))
  • 您的结果是这样,但预期结果如何?
  • 我的结果类似于 A - A C B、B - C B A、C - A B C 等。以上是我所期待的。

标签: c# asp.net linq


【解决方案1】:

您的问题是您最后的OrderBy 语句是对组本身进行排序。您要做的是对每个组的元素进行排序。试试:

   records.results
     .Where(table => string.Compare(table, expected) == 0)
     .OrderByDescending(table => table.name)
     .GroupBy(table => table.name);
     .Select(g => g.OrderByDescending(element => element.Name);

我不确定您要订购组的属性的名称是什么,但在这里我假设它是Name

这里的关键是要记住IGrouping 本身就是IEnumerable。参见IGroupinghere的文档,注意它实现了IEnumerable,所以我们可以在你IGroupingsIEnumerable中的每个组上调用OrderByDescending,也就是Enumerable.GroupBy的返回类型(documented here)。

由于OrderByDescending 将返回IEnumerable(而不是IGrouping),因此此操作将丢失每个组的Key 属性。如果您需要,那么您可能只想选择一个匿名类型来保留密钥。将最后的 Select 替换为:

 .Select(g => new { g.Key, elements = g.OrderByDescending(element => element.Name) });

或者,您可以按照here 的指示在此处编写一些逻辑来实例化IGrouping

【讨论】:

  • 请注意,最后一个选择丢失了组的Key 属性。如果需要,您可能需要将您拥有的查询和该键值都粘贴到一个新的(可能是匿名的)对象中。如果您不需要密钥,那么这很好。
  • @Servy 好电话。我已经为此添加了一条注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多