Linq to entities,EF6中的寻呼:SkipWhile的替代方案?

时间:2016-02-24 11:39:41

标签: c# entity-framework linq linq-to-entities

我想使用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附近,但还没有找到对它的好解释。

1 个答案:

答案 0 :(得分:0)

很难找到SkipWhile的替代品,因为EF也不支持任何编号功能。因此,基于相对顺序的一切都很难。

在这里,您可以使用以下查询表单:

   return source
            .Where(x => x.PositioningKey > lastSeenValue)
            .Orderby(x => x.PositioningKey)
            .Take(pageSize)