我想创建分页,我的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}
答案 0 :(得分:4)
尝试:
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)
答案 1 :(得分:4)
错误描述了确切的要求 - 在跳过/采取任何意义之前,需要对序列进行排序。您已经知道了您想要的顺序 - 您只需要在逻辑管道中比分页更早地实现它。此外,在此处使用查询表达式确实没有任何好处。我建议你使用:
var query = db.Projects
.OrderByDescending(c => c.ProjectId)
.Skip(2)
.Take(2);
(如果你真的想要它,那么这一切都可以在一行中,但我发现如果管道垂直布局,就更容易理解。)
请注意,我还推翻了Skip
和Take
的顺序 - 在<{1}}之前,您几乎从不想要Take
。 ..在您的示例代码中,您显示了Skip
,它永远不会返回任何结果...... Take(2).Skip(2)
部分的结果是一个最多包含两个结果的序列,然后是{ {1}}正在跳过前两个结果......什么都不留。通常你有类似的东西:
Take(2)