Linq查询中的订单子组

时间:2013-06-07 16:59:13

标签: c# asp.net linq

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

    • A
    • C
    • A
    • C

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

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

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

1 个答案:

答案 0 :(得分:2)

您的问题是您的最终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。请参阅IGrouping here的文档,并注意它实现了IEnumerable,因此我们可以在OrderByDescending IEnumerable中的每个群组上致电IGroupings ,这是Enumerable.GroupBy的返回类型(记录为here)。

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

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

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