我想使用linq在页面中显示序列,操作员可以请求显示上一页或下一页。每个页面都有一个恒定的页面大小。
关于stackoverflow的几个问题处理如何执行此操作,a.o。 Paging with LINQ for objects
解决方案建议使用Skip和Take。只要序列在查看时没有改变,这种方法就可以正常工作。但是,如果在查看页面时插入或删除了项目,您将错过项目。
示例:页面大小= 10个项目。我正在查看第8页(零基础),其中包含项目80到89.显然,如果我按下页面,我想看到项目70到79.但是,如果有人在项目25附近插入了5个项目(所以我正在查看的页面之外),我会遗漏一些物品。
原因是因为该软件认为正在查看第8页,而由于插入,我实际上正在查看第8.5页。
因此,我应该使用一个函数来返回给定元素之后的元素,或者在序列中的给定项之前返回,而不是使用Skip(pagenumber * pagesize)。通常SkipWhile(...)就足够了:
private static IEnumerable<T> ItemsAfter(this IEnumerable<T> source,
Func<TSource, bool> predicate, int pageSize)
{
return source.Orderby(...)
.SkipWhile(predicate)
.Take(pageSize)
}
然而,LINQ不会向实体识别SkipWhile。那还有其他选择吗?
添加:我想要的是:给定一个排序序列中的元素,给我接下来的10个元素(或前10个)我认为解决方案在SQL Fetch Next和Fetch Prior附近,但还没有找到对它的好解释。
答案 0 :(得分:0)
很难找到SkipWhile
的替代品,因为EF也不支持任何编号功能。因此,基于相对顺序的一切都很难。
在这里,您可以使用以下查询表单:
return source
.Where(x => x.PositioningKey > lastSeenValue)
.Orderby(x => x.PositioningKey)
.Take(pageSize)