为什么Linq GroupBy After order取消了order操作
本文关键字:order 取消 操作 After Linq GroupBy 为什么 | 更新日期: 2023-09-27 18:18:48
我有一个Action模型,具有Session Navigation属性,
考虑以下代码:
var x=db.Actions.OrderBy(p => p.Session.Number).ThenBy(p => p.Date);//it's OK
x是一个有序的Action,但是当在x上分组时,在有序的enumerable上手动分组不迭代x(基于Action. session ):
var y=x.GroupBy(p=>p.Session).ToArray()
我有一个会话组(Key,IGrouping),但为什么是组。基于Session.Number,键未排序?
如何达到一组会话顺序按数字和每组按日期排序?
因为是Enumerable.GroupBy
保持了秩序。Queryable.GroupBy
没有这样的承诺。从前者的文档中:
igrouing (Of TKey, element)对象是按顺序产生的源中产生每个元素第一个键的元素的顺序分组(键,元素)。分组中的元素按顺序产生
你打电话给后者,上面没有提到。在GroupBy
之后再呼叫OrderBy
,使其工作
Update:由于您显然希望对不仅仅是GroupBy键进行排序,因此您应该能够使用另一个GroupBy重载来指定要对每个会话的操作列表进行排序:
db.Actions.GroupBy(
p => p.Session,
(session, actions) => new {
Session = session,
Actions = actions.OrderBy(p => p.Date)
}).OrderBy(p => p.Session.Number).ToArray();
因为没有定义GroupBy保留插入顺序或底层键顺序(对于本地内存工作,Dictionay<,>
也没有这样的保证)。只在分组后订购,而不是:
var y = db.Actions.GroupBy(p=>p.Session).OrderBy(grp => grp.Key).ToArray();
特别要注意的是,要直接转换顺序,需要它分析表达式,以找出顺序的哪些部分与分组重叠(哪些不重叠),这是非常重要的。
感谢@Marc Gravell &@hvd关于groupby IGrouping(Of TKey, telelement)不是保留TKey的顺序而是保留telelement的顺序的注意事项。
所以我的回答我的最后一个问题(我如何达到一组会话顺序按数字和每组按日期排序?)是:
var x= db.Actions
.OrderBy(p => p.ActionDateTime)
.GroupBy(p => p.Session)
.OrderBy(q => q.Key.Number)
.ToArray();
仅名称GroupBy
就表明,此时查询的数据将根据所提供的参数分组、聚合(按您想要的方式调用)到另一个数据单元中。
一般来说,如果你想看到结果sorted
, Sort()
函数调用应该是序列中的最后一个。