Dapper ORMページングとソート

dapper orm vb.net

質問

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はこれを助けるために「スキップ」と「テイク」を持っています。マイクロORMにはこれが組み込まれていないが、これを達成するための最善の方法を知りたいと思う。

受け入れられた回答

スキップして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

人気のある回答

あなたは今それをすることができます。
あなたがする必要があるのは、QueryとPageSizeとPageNumberをとる拡張メソッドを書くことだけです。

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

クエリに行を付けて実行します。
クエリには少なくともT-SQLではORDER-BY句が必要であることに注意してください
これは、MS-SQL(2012+)、PostgreSQL(8.4+)、およびOracle(12c +)で動作します。
MySQLの場合、LIMIT offset、page_sizeを追加する必要があります。

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

Firebirdの場合は、ROWS 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 


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow