为什么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,键未排序?

如何达到一组会话顺序按数字和每组按日期排序?

为什么Linq GroupBy After order取消了order操作

因为是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()函数调用应该是序列中的最后一个。