当我使用"LINQ to entities"显示每个产品并在 MVC 中实现分页 ASP.NET 时,我遇到了此错误:
The method 'Skip' is only supported for sorted input in LINQ to Entities.
The method 'OrderBy' must be called before the method 'Skip'."
林克:
Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
我该如何解决它?如果我放OrderBy
而不是Where
会发生什么?
你不会"放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
如果您没有明确告诉数据库服务器返回结果的顺序...您的结果每次(可能)都会有所不同。然而,如果您按字段排序,则保证它们按顺序排列,因此您的分页将产生一致的结果。
您可以添加 ".OrderBy(i => 0)"来解决限制,如果您不知道需要对哪一列进行排序。如果你想编写一些你不知道前面类的类型的泛型函数,这将非常有用。
没有必要用OrderBy
代替Where
,在这种情况下,你会失去你的where
子句。
OrderBy
方法用于按升序对数据进行排序。您需要记住的最重要的一点是,此方法不会更改数据,而只是更改数据的顺序。
因此,您可以使用OrderByDescending()
或OrderBy()
方法来避免遇到的错误。
Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
.OrderByDescending(p => p.ID) // or put some other column from your table for ordering data
或
Model.Name = db.Products.Where(p => p.ProductSubcategoryID == id)
.OrderBy(p => p.ID)
您可以在任何数据类型上使用 OrderBy
方法,即您可以使用字符、字符串、十进制、整数等。