SQL Server 2008的EntityFramework(使用LINQ)中的基于偏移/获取的分页(实现)

时间:2017-07-25 11:55:23

标签: sql-server entity-framework sql-server-2008 pagination entity-framework-6

我正在使用SQL Server 2008和Entity Framework 6.1.3。我希望实现基于OFFSET / FETCH的数据分页而不是Take()&跳过()。

我在线搜索没有运气。有些帖子建议迁移到SQL Server 2012.在我的情况下,这不是一个选项。

有人可以建议如何在SQL Server 2008和EF 6.1.3中使用OFFSET / FETCH

3 个答案:

答案 0 :(得分:7)

使用Entity Framework 6.1.2及以上版本可以实现这一点,因此您可以在项目中使用它。标准的Skip and Take方法无法以与其他方式相同的方式捕获。现在有两个额外的Skip / Take方法重载需要lambda,所以不要这样:

var results = context.MyTable
    .Skip(10)
    .Take(5);

这样做:

var results = context.MyTable
    .Skip(() => 10)
    .Take(() => 5);

答案 1 :(得分:1)

解决方法是使用XML编辑器修改EDMX文件,并将ProviderManifestToken的值从2012年更改为2008年。我在EDMX文件的第7行中找到了这一点。保存更改后,将使用“旧的” SQL Server 2008兼容语法生成分页SQL。

答案 2 :(得分:-1)

此示例可帮助您在Sql server中使用OffSET

DECLARE @PageNo INT=NULL, 
@RowsPerPage INT=2
;WIth cte(id, name, qty, price)
AS
(
SELECT 2,'a', 2, 20 UNION ALL
SELECT 3,'d', 2, 10 UNION ALL
SELECT 4,'b', 3, 60
)
,cte2 AS (SELECT id, name, qty, price , 1 AS n FROM cte
UNION ALL
SELECT id, name, qty, price , n+1 From cte2 t
WHERE n< t.qty
)
SELECT
  ROW_NUMBER() OVER (ORDER BY (SELECT 1) ) AS Seq,
  id,
  name,
  qty,
  price
FROM cte2
ORDER BY 2, 3, n

OFFSET (COALESCE((CASE  WHEN @PageNo <= 0 THEN 1
                        WHEN @PageNo > 0 THEN @PageNo END), 1) - 1) ROWS
FETCH NEXT @RowsPerPage ROWS ONLY