【问题标题】:How to solve "The method 'Skip' is only supported for sorted input in LINQ to Entities."如何解决“仅 LINQ to Entities 中的排序输入支持‘跳过’方法。”
【发布时间】:2014-04-02 03:20:44
【问题描述】:

我在使用“LINQ to entity”显示每个产品并在 ASP.NET MVC 中实现分页时遇到此错误。:

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

LINQ:

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();

我该如何解决?如果我输入 OrderBy 而不是 Where 会发生什么?

【问题讨论】:

  • 您是否尝试使用OrderBy 而不是Where?当你这样做时发生了什么?
  • @Cupcake 是的,我试过了。 OrderBy 的结果返回所有与特定 ID 无关的产品。

标签: c# linq entity-framework linq-to-entities


【解决方案1】:

你不要“用OrderBy代替Where”...你把它们组合起来:

Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
                        .OrderBy(p => p.ProductSubcategoryID) // <---- this
                        .Skip((page - 1) * pageSize)
                        .Take(pageSize)
                        .ToList();

这是必需的,因为生成的 SQL 会产生如下内容:

WHERE generated_id BETWEEN x AND y

如果您没有明确告诉数据库服务器返回结果的顺序...您的结果每次都会不同(可能)。然而,如果您按字段排序,则可以保证它们按顺序出现,因此您的分页将产生一致的结果。

【讨论】:

    【解决方案2】:

    如果您不知道需要对哪一列进行排序,您可以添加“.OrderBy(i => 0)”来解决此限制。如果你想写一些你不知道前面类的类型的泛型函数,这是非常有用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2014-03-09
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多