为什么Linq GroupBy在OrderBy之后解雇订单操作?

时间:2011-12-27 11:59:46

标签: c# linq linq-to-entities

我的行动模型包含会话导航属性,

考虑以下代码:

var x=db.Actions.OrderBy(p => p.Session.Number).ThenBy(p => p.Date);//it's OK

x是一个有序的Action,但是当在x上分组时,group不会在有序的可枚举上手动迭代x(基于 Action.Session ):

var y=x.GroupBy(p=>p.Session).ToArray()

你有一个小组(Key,IGrouping),但为什么group.Key 未订购基于 Session.Number

如何按编号和按日期排序的每个组达到一组会话顺序?

4 个答案:

答案 0 :(得分:3)

因为Enumerable.GroupBy保留了订单。对Queryable.GroupBy没有这样的承诺。 从前者的文件:

  

IGrouping(Of TKey,TElement)对象以基于的顺序产生   源中产生每个元素的第一个键的元素的顺序   IGrouping(Of TKey,TElement)。分组中的元素按顺序生成   它们出现在源头。

你打电话给后者,上面没有提到。 <{1}}后调用OrderBy使其正常工作。

更新:因为您显然想要排序的不仅仅是GroupBy键,您应该能够使用另一个GroupBy重载来指定每个会话的操作列表是排序方法:

GroupBy

答案 1 :(得分:2)

因为没有定义GroupBy保留插入顺序或底层键顺序(与Dictionay<,>没有这样的保证相同的方式,对于本地内存工作)。只需在分组后订购,而不是:

var y = db.Actions.GroupBy(p=>p.Session).OrderBy(grp => grp.Key).ToArray();

特别要注意,要直接翻译顺序,需要它分析表达式,以找出排序的哪些部分与分组重叠(哪些不重要),这是非常重要的。

答案 2 :(得分:0)

只有名称GroupBy表示此时查询的数据将根据提供的参数进行分组,聚合(根据需要调用)到另一个数据单元。

通常,如果您想查看结果sortedSort()函数调用应该是最后一个。

答案 3 :(得分:0)

感谢@Marc Gravell&amp; @hvd关于groupby IGrouping(Of TKey,TElement)的注释不保留TKey的顺序但保留TElement的顺序。

所以我对最后一个问题的答案(如何按编号和按日期排序的每个小组达到一组会话顺序?)是:

var x= db.Actions
.OrderBy(p => p.ActionDateTime)
.GroupBy(p => p.Session)
.OrderBy(q => q.Key.Number)
.ToArray();