我的行动模型包含会话导航属性,
考虑以下代码:
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 ?
如何按编号和按日期排序的每个组达到一组会话顺序?
答案 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
表示此时查询的数据将根据提供的参数进行分组,聚合(根据需要调用)到另一个数据单元。
通常,如果您想查看结果sorted
,Sort()
函数调用应该是最后一个。
答案 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();