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}
尝试:
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);
(如果你真的想要的话,这一切都可以在一行中,但我发现如果管道垂直布局,理解管道会更简单。
请注意,我还颠倒了Skip
和Take
的顺序 - 你几乎从不想在Skip
之前Take
......在您的示例代码中,您已经展示了永远不会返回任何结果Take(2).Skip(2)
...Take(2)
部分的结果是一个最多有两个结果的序列,然后Skip(2)
跳过这些结果中的前两个......什么都不留下。通常,您有这样的内容:
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)