我正在使用SQL Server 2008和Entity Framework 6.1.3。我希望实现基于OFFSET / FETCH的数据分页而不是Take()&跳过()。
我在线搜索没有运气。有些帖子建议迁移到SQL Server 2012.在我的情况下,这不是一个选项。
有人可以建议如何在SQL Server 2008和EF 6.1.3中使用OFFSET / FETCH
答案 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