2011-05-07 133 views
15

我正在給Dapper ORM一個嘗試。我能夠使用下面的代碼從表中查詢數據: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進行分頁/排序。英孚已經「跳過」和「採取」來幫助解決這個問題。我明白,一個微型ORM沒有內置的,但想知道完成這個最好的方法。

回答

19

如果你想跳過並採取Dapper,you do it with 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 
+2

是,也牢記這是數據庫依賴,Oracle和MySQL的有限制和偏移,迪納利,抵消等等。 – 2011-05-07 11:08:51

+1

**其中**應位於內部查詢中,否?你應該在最後的查詢(cc @Sam)上使用rownum **顯式的**命令。 – 2011-05-07 11:28:39

+1

@Marc是的,你需要一個命令,然後結束..內部查詢中可能需要或可能不需要的地方,有時你可以添加一個TOP @y到內部查詢來獲得一個性能提升 – 2011-05-07 11:30:47

0

你現在可以做到。
所有你需要做的是寫一個需要查詢和每頁和的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 

對於火鳥,你就必須追加行X到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 
-- 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