The method 'Skip' is only supported for sorted input in LINQ to Entities

前端 未结 4 1091
暖寄归人
暖寄归人 2021-02-12 10:18

What could be causing this problem?

public ActionResult Index(int page = 0)
{
    const int pageSize = 3;
    var areas = repo.FindAllAreas();
    var paginatedA         


        
相关标签:
4条回答
  • 2021-02-12 10:34

    that is worked (use first IOrderedQueryable):

    http://msdn.microsoft.com/en-us/library/bb738702.aspx

     IOrderedQueryable<Product> products = context.Products
            .OrderBy(p => p.ListPrice);
    
    IQueryable<Product> allButFirst3Products = products.Skip(3);
    
    Console.WriteLine("All but first 3 products:");
    foreach (Product product in allButFirst3Products)
    {
        Console.WriteLine("Name: {0} \t ID: {1}",
            product.Name,
            product.ProductID);
    }
    
    0 讨论(0)
  • 2021-02-12 10:34

    An IQueryable does not have an order, so saying "ignore the next x elements" doesn't make any sense.

    If you include an order by clause (or possibly an AsEnumerable() call - untested) then your data takes an order and Skip and Take are now sensible.

    0 讨论(0)
  • 2021-02-12 10:37

    I wanted to validate this by running the SQL equivalent of a similar LINQ skip/take query.

    SELECT * FROM [table]
    --order by [column] //omitted!
    OFFSET 10 ROWS
    FETCH NEXT 15 rows only
    

    Note that when the order-by clause is omitted, the SQL error is much less informative:

    "Invalid usage of the option NEXT in the FETCH statement."
    

    So the "sorted input" is actually required on the database-level. Kudos to LINQ for helping developers write advanced SQL statements!

    0 讨论(0)
  • 2021-02-12 10:49

    Seems like the error is exactly what it is says. "Skip is only allowed on Sorted inputs". Searching for this error, I've found this.

    It should be fixed if you include an OrderBy before Skip:

    source.orderBy(???).Skip(PageIndex * PageSize).Take(PageSize)); 
    

    Which might be a problem since you are passing a generic object T. You might need to expand your class to receive another parameter to indicate the order by element.

    0 讨论(0)
提交回复
热议问题