分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 'OrderBy' 必须在方法 'Skip' 之前调用

Posted

技术标签:

【中文标题】分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 \'OrderBy\' 必须在方法 \'Skip\' 之前调用【英文标题】:Paging Error :The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 'OrderBy' 必须在方法 'Skip' 之前调用 【发布时间】:2014-05-13 05:18:46 【问题描述】:

我正在 MVC 中的索引页面上进行分页..在这一行我收到错误

return View( employee.ToPagedList(Page ?? 1,3));

这里是索引方法

 public ActionResult Index(string searchBy, string search, int? Page, string sortBy)
    
        ViewBag.SortNameParameter = string.IsNullOrEmpty(sortBy) ? "Name desc"
            : "";

        ViewBag.SortGenderParameter = string.IsNullOrEmpty(sortBy) ? "Gender desc"
            : "Gender";

        var employee = db.Employees.AsQueryable();

        if (searchBy == "Gender")
        
            employee = employee.Where(x => x.Gender == search || search == null);
        
        else
        
            employee = employee.Where(x => x.FUllName .StartsWith(search ) || search == null);
        

        switch (sortBy)
        
            case "Name desc":
                employee = employee.OrderByDescending(x => x.FUllName);
                break;

            case "Default":
                employee = employee.OrderBy(x => x.FUllName);
                break;
        

      return View( employee.ToPagedList(Page ?? 1,3));
    

我没有使用Skip方法...但是有这个错误:

“Skip”方法仅支持 LINQ to 中的排序输入 实体。必须在方法之前调用方法“OrderBy” “跳过”。

我看过类似的帖子

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

How to solve "The method 'Skip' is only supported for sorted input in LINQ to Entities."

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

ASP.NET MVC 3 PagedList. The method 'Skip' is only supported for sorted input in LINQ to Entities.

并做了以下更改...

1.将employee.Where代码放在switch语句前:

2. 在你的 switch 语句中添加一个默认情况,并让它抛出。 案例“默认”: throw new ArgumentException("error", sortBy);

    使用 IOrderedQueryable 类型。

    IQueryable 员工 = db.Employees.AsQueryable();

这不能解决问题.. 大多数情况下,他们使用的是 Skip 方法..但我没有...而且其他帖子查询很复杂..

请提出遗漏的建议

【问题讨论】:

【参考方案1】:

你确实有一个Skip 方法。

PagedList 为您添加了它。检查代码。这就是分页的工作原理,TakeSkip

我也认为你的案例陈述是为了

    switch (sortBy)
    
        case "Name desc":
            employee = employee.OrderByDescending(x => x.FUllName);
            break;

        default: // Not: case "Default"
            employee = employee.OrderBy(x => x.FUllName);
            break;
    

【讨论】:

是的..这是答案...默认..不是:案例“默认”...谢谢【参考方案2】:

请试试这个代码

    var employee = db.Employees.ToList()// Try to change AsQueryable to Ilist or List

    if (searchBy == "Gender")
    
        employee = employee.Where(x => x.Gender == search || search == null).ToPagedList(Page ?? 1,3);
    
    else
    
        employee = employee.Where(x => x.FUllName .StartsWith(search ) || search == null).ToPagedList(Page ?? 1,3);
    
     switch (sortBy)
    
        case "Name desc":
            employee = employee.OrderByDescending(x => x.FUllName);
            break;

        case "Default":
            employee = employee.OrderBy(x => x.FUllName);
            break;
    

      return View( employee);

【讨论】:

然后出现类型转换错误...错误 1 ​​无法将类型“System.Linq.IOrderedEnumerable<_searchdemo.models.employee>”隐式转换为“PagedList.IPagedList<_searchdemo.models.employee>”。存在显式转换(您是否缺少演员表?)... 我尝试将员工类型转换为 IPagedList 类型和 var 类型..但这并没有解决问题 然后改变 var employee = db.Employees.AsQueryable();到 IList 员工

以上是关于分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 'OrderBy' 必须在方法 'Skip' 之前调用的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities中数据分页时,必须要OrderBy吗

使用 Linq to Entities 在一次操作中获取 COUNT 和 SKIP TAKE

LINQ to Entities 仅支持使用 IEntity 接口强制转换 EDM 基元或枚举类型

无法将类型A强制转换为类型B. LINQ to Entities仅支持强制转换EDM原语或枚举类型

错误:LINQ to Entities 无法识别方法 DataLength

错误,LINQ to Entities 不支持的方法