Skip()
使用和Take()
扩展可以轻松地使用 LINQ 进行分页。
很长一段时间以来,我一直在摸索,试图找到一种对实体的动态集合执行分页的好方法——即可以在两个顺序查询之间更改的集合。
假设query
没有分页将返回 20 个类型的对象MyEntity
。
以下两行将触发两个数据库命中,这些命中将填充数据集中results1
的results2
所有对象。
List<MyEntity> results1 = query.Take(10).ToList();
List<MyEntity> results2 = query.Skip(10).Take(10).ToList();
现在让我们假设数据是动态的,并且MyEntity
在两个查询之间将一个新实体插入到数据库中,这样原始查询会将新实体放在第一页中。
在这种情况下,results2
list 将包含一个也存在于 中的实体results1
,
从而导致发送给查询消费者的结果重复。
假设从第一页删除了一条记录,这将导致丢失一条原本应该出现的记录results2
。
我考虑Where()
在查询中添加一个子句,以验证在前一页上未检索到的记录,但这似乎是错误的方法,并且对第二种情况没有帮助。
我考虑记录查询执行的时间戳,将 a 附加LastUpdatedTimestamp
到每个实体并过滤在上一页请求之后更改的实体。之后,该方向将在第三页失败......
这通常是如何完成的?
有没有办法对数据库的旧快照运行查询?
编辑: 背景是一个 Asp.NET MVC WebApi 服务,它响应一个简单的 GET 请求来检索实体列表。客户端检索实体页面,并将它们呈现给用户。向下滚动时,客户端向服务发送另一个请求,以检索另一个实体页面,该实体应添加到已经呈现给用户的第一页。