Linq 限制记录会为分页提供错误

本文关键字:分页 错误 记录 Linq | 更新日期: 2023-09-27 18:32:35

我想创建分页,我的 LINQ 查询给出错误:

var query = from c in db.Projects.Take(2).Skip(2) orderby c.ProjectId descending select c;

给出以下错误:

$exception  {"The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'."} System.Exception {System.NotSupportedException}

Linq 限制记录会为分页提供错误

尝试:

var query = (from c in db.Projects orderby c.ProjectId descending select c).AsEnumerable().Skip(2).Take(2)

或更高效(归功于Jon Skeet)

var query = (from c in db.Projects orderby c.ProjectId descending select c).Skip(2).Take(2)

该错误准确描述了所需的内容 - 您的序列需要在跳过/采取任何意义之前进行排序。您已经知道您想要什么顺序 - 您只需要在逻辑管道中比分页更早地实现它。此外,在此处使用查询表达式实际上没有任何好处。我建议你使用:

var query = db.Projects
              .OrderByDescending(c => c.ProjectId)
              .Skip(2)
              .Take(2);

(如果你真的想要的话,这一切都可以在一行中,但我发现如果管道垂直布局,理解管道会更简单。

请注意,我还颠倒了SkipTake的顺序 - 你几乎从不想Skip之前Take......在您的示例代码中,您已经展示了永远不会返回任何结果Take(2).Skip(2)...Take(2)部分的结果是一个最多有两个结果的序列,然后Skip(2)跳过这些结果中的前两个......什么都不留下。通常,您有这样的内容:

.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)