你现在可以做到这一点。
你只需要编写一个扩展方法,它接受查询、页面大小和页码,然后你需要追加
。
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
将查询语句添加到行并执行。
请注意,查询绝对需要一个ORDER-BY子句(至少在T-SQL中)。
这适用于MS-SQL(2012+),PostgreSQL(8.4+)和Oracle(12c+)。
对于MySQL,您必须附加LIMIT offset、page_size。
LIMIT @PageSize * (@PageNumber - 1), @PageSize
对于Firebird,您需要附加ROWS x TO y。
ROWS (@PageSize * (@PageNumber - 1)) TO (@PageSize * @PageNumber -1)
对于基于1的索引,起始偏移量为startoffset_base1,结束偏移量为endoffset_base1
StartAt @PageSize * (pagenum - 1) + 1 EndAt @PageSize * (pagenum - 1) + @PageSize
例子:
DECLARE @PageSize int
DECLARE @PageNumber int
SET @PageSize = 5
SET @PageNumber = 2
SELECT * FROM T_Users
ORDER BY USR_ID
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
关于不同关系数据库管理系统的语法,请参见
http://www.jooq.org/doc/3.5/manual/sql-building/sql-statements/select-statement/limit-clause/
验证:
DECLARE @PageSize int
SET @PageSize = 5
;WITH CTE AS
(
SELECT 1 as pagenum
UNION ALL
SELECT pagenum+1 AS pagenum
FROM CTE
WHERE CTE.pagenum < 100
)
SELECT
pagenum
,@PageSize * (pagenum - 1) AS StartOFFSETBase0
,@PageSize * pagenum - 1 AS EndOFFSETBase0
,@PageSize * (pagenum - 1) + 1 AS StartOFFSETBase1
,@PageSize * (pagenum - 1) + @PageSize AS EndOFFSETBase1
FROM CTE