如何解决"The method 'Skip' is only supported for sorted input in LINQ to Entities."



当我使用"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 方法,即您可以使用字符、字符串、十进制、整数等。

相关内容

  • 没有找到相关文章