Linq to entities, Paging in EF6: SkipWhile 的替代方法

本文关键字:SkipWhile 方法 EF6 entities to Paging in Linq | 更新日期: 2023-09-27 18:36:09

我想使用 linq 在页面中显示序列,操作员可以在其中请求显示上一页或下一页。每个页面都有一个恒定的页面大小。

关于堆栈溢出处理如何做到这一点的几个问题,a.o.使用 LINQ 对对象进行分页

这些解决方案建议使用"跳过"和"获取"。只要序列在查看时不更改,就可以正常工作。但是,如果在查看页面时插入或删除了项目,您将错过项目。

示例:页面大小 = 10 个项目。我正在查看包含项目 80 到 89 的第 8 页(从零开始)。显然,如果我按 pageup,我想看到项目 70 到 79。但是,如果有人在项目 5 附近的某个地方插入了 25 个项目(所以远离我正在查看的页面),我会错过一些项目。

造成这种情况的原因是因为软件认为正在查看第 8 页,而由于插入,我实际上正在查看第 8.5 页。

因此,我应该使用一个函数,该函数在给定元素之后或序列中的给定项目之前返回元素,而不是使用 Skip(页码 * pagesize)。通常跳过而(...)就足够了:

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 附近,但还没有找到一个很好的解释。

Linq to entities, Paging in EF6: SkipWhile 的替代方法

很难

想出SkipWhile的替代品,因为 EF 也不支持任何编号函数。因此,基于相对顺序的一切都是困难的。

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

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