【问题标题】:Paginating a linq query which uses OrderBy对使用 OrderBy 的 linq 查询进行分页
【发布时间】:2013-01-08 19:36:58
【问题描述】:

我想返回按某个属性分组的某个实体的列表,按时间戳降序排列并分页(使用 Skip 和 Take)。我得到的是这样的:

container.CoinMessageSet.Where(
                c => c.MessageState != MessageStateType.Closed &&
                     (c.DonorOperator.OperatorCode.Equals("opcode") ||
                      c.RecipientOperator.OperatorCode.Equals("opcode"))
                ).OrderByDescending(c => c.TimeStamp)
                 .GroupBy(c => c.Reference).Skip(x).Take(100);

执行后我得到了异常:

The method 'Skip' is only supported for sorted input in LINQ to Entities. 
The method 'OrderBy' must be called before the method 'Skip'.

...我调用了 OrderBy()(尽管是降序),并且在 Skip() 之前调用了它!我错过了什么?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    您还没有订购组;你需要这样做才能分页。例如:

    .GroupBy(c => c.Reference).OrderBy(grp => grp.Key).Skip(x).Take(100);
    

    (如果您希望分组倒序,也可以替换为OrderByDescending

    另外:由于您是分组,原始数据中的顺序在很大程度上没有意义;您可能可以删除OrderByDescending(c => c.TimeStamp)

    所以最终结果:

    var query = container.CoinMessageSet.Where(
                c => c.MessageState != MessageStateType.Closed &&
                     (c.DonorOperator.OperatorCode.Equals("opcode") ||
                      c.RecipientOperator.OperatorCode.Equals("opcode"))
                ).GroupBy(c => c.Reference).OrderBy(grp => grp.Key)
                 .Skip(x).Take(100);
    

    或者可能:

    var query = (from c in container.CoinMessageSet
                 where c.MessageState != MessageStateType.Closed &&
                      (c.DonorOperator.OperatorCode == "opcode" ||
                       c.RecipientOperator.OperatorCode == "opcode")
                 group c by c.Reference into grp
                 orderby grp.Key
                 select grp).Skip(x).Take(100);
    

    【讨论】:

    • 感谢您对原始问题的澄清,并意识到我有一个新问题;)(即'我必须按 TimeStamp 订购,但由于 GroupBy 这在很大程度上没用)
    【解决方案2】:

    这很可能是因为OrderByDescending之后的GroupBy

    我觉得你可以试试:

    container.CoinMessageSet.Where(
                    c => c.MessageState != MessageStateType.Closed &&
                         (c.DonorOperator.OperatorCode.Equals("opcode") ||
                          c.RecipientOperator.OperatorCode.Equals("opcode"))
                    ).OrderByDescending(c => c.TimeStamp)
                     .GroupBy(c => c.Reference).OrderByDescending(c = > c.Key).Skip(x).Take(100);
    

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2014-10-16
      • 1970-01-01
      • 2017-10-12
      • 2021-03-03
      • 2011-01-23
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多