16

我正在尝试使用 Dapper ORM。我可以使用以下代码从表中查询数据:

Dim comments As List(Of Comment)
Using conn = New SqlConnection(ConnectionString)
    conn.Open()
    comments = conn.Query(Of Comment)("SELECT * from comments where userid = @commentid", New With {.userid= 1})
End Using

Return View(comments)

我有兴趣了解如何使用 Dapper 进行分页/排序。EF 有“skip”和“take”来帮助解决这个问题。我知道微型 ORM 没有内置此功能,但想知道实现此功能的最佳方法。

4

2 回答 2

19

如果你想跳过并使用 Dapper,你可以使用 T-SQL

SELECT *
FROM
(
SELECT tbl.*, ROW_NUMBER() OVER (ORDER BY ID) rownum
FROM comments as tbl
) seq
 WHERE seq.rownum BETWEEN @x AND @y
 AND userid = @commentid
 ORDER BY seq.rownum
于 2011-05-07T01:50:45.630 回答
0

你现在可以做到。
您需要做的就是编写一个采用 Query 和 PageSize 和 PageNumber 的扩展方法,然后您需要附加

OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;

查询并执行。
请注意,查询绝对需要 ORDER-BY 子句 (至少在 T-SQL 中)。
这适用于 MS-SQL (2012+)、PostgreSQL (8.4+) 和 Oracle (12c+)。
对于 MySQL,您必须附加 LIMIT 偏移量 page_size。

LIMIT @PageSize * (@PageNumber - 1), @PageSize 

对于 Firebird,您必须将 ROWS x 附加到 y

ROWS (@PageSize * (@PageNumber - 1)) TO (@PageSize * @PageNumber -1) 

对于 base-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 
-- Must contain "ORDER BY" 
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;

有关各种不同 RDBMS 的语法,请参阅
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) + @PageSize - 1 AS EndOFFSETBase0
    ,@PageSize * pagenum - 1 AS EndOFFSETBase0 -- Simplified

    ,@PageSize * (pagenum - 1) + 1 AS StartOFFSETBase1
    ,@PageSize * (pagenum - 1) + @PageSize AS EndOFFSETBase1
FROM CTE 
于 2016-10-12T09:47:22.747 回答