Linq Limiting记录给出了分页错误?

时间:2014-11-29 10:02:34

标签: c# asp.net-mvc linq entity-framework asp.net-mvc-5

我想创建分页,我的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}

2 个答案:

答案 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);

(如果你真的想要它,那么这一切都可以在一行中,但我发现如果管道垂直布局,就更容易理解。)

请注意,我还推翻了SkipTake的顺序 - 在<{1}}之前,您几乎从不想要Take。 ..在您的示例代码中,您显示了Skip,它永远不会返回任何结果...... Take(2).Skip(2)部分的结果是一个最多包含两个结果的序列,然后是{ {1}}正在跳过前两个结果......什么都不留。通常你有类似的东西:

Take(2)