【问题标题】:Paging with LINQ without sorting使用 LINQ 进行分页而不进行排序
【发布时间】:2014-04-03 17:09:21
【问题描述】:

我想用 LINQ to entity (EF) 创建分页,我找到了Skip 方法,但它只支持排序输入,所以我认为它在大量行中会很慢。有什么方法可以在不先排序的情况下进行分页吗?

【问题讨论】:

  • Skip 可以与任何IEnumerable<T> 一起使用。您是否使用某种将 Linq 查询转换为 SQL 的 ORM?
  • @p.s.w.g 是的,我忘了把它添加到标签中
  • 如果您有PK,请按此排序。通常底层的 RDBMS 可以有效地做到这一点。
  • 不幸的是,您必须对其进行排序 :( 如果在没有 OrderBy 的情况下在 EF 中使用 Skip 方法,您将得到下一个异常:The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'

标签: c# .net linq entity-framework


【解决方案1】:

对于特定的 SQL 查询,如果没有声明特定的顺序,数据库没有义务以相同的顺序返回记录集。

您可以运行相同的查询,但每次运行的前 10 条记录都不同。数据库将根据最适合自己的方式执行此操作(哪些部分数据缓存在内存中,哪些部分在两次执行同​​一查询之前发生了变化等)。

因此,无论您使用什么 ORM,您都必须指定您想要数据的顺序。并确保您有一个正确定义的索引,用于根据该索引对记录进行排序。

【讨论】:

  • 现在我应该先排序,我担心它的性能:context.Users.Where(u => u.Id != currentUserId).Select(u => u).OrderBy(u=>u.Id).Skip((page-1)*perPage).Take(perPage);
  • 我认为这里不需要.Select(u => u);是的;这基本上是为了得到你想要的而应该做的。既然是Id我猜是你的主键,所以我觉得你的表现应该不会那么差。
猜你喜欢
  • 2021-06-30
  • 2021-10-23
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多