Dapper ORM pagination et tri

dapper orm vb.net

Question

Je donne un essai à l'ORM Dapper. Je suis en mesure d'interroger les données d'une table en utilisant le code ci-dessous:

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)

Je suis intéressé d'apprendre comment faire de la pagination / tri à l'aide de Dapper. EF a "sauter" et "prendre" pour vous aider. Je comprends qu'un micro ORM ne dispose pas de cette fonctionnalité mais souhaite connaître le meilleur moyen d'y parvenir.

Réponse acceptée

Si vous voulez faire un saut avec Dapper, vous le faites avec 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

Réponse populaire

Vous pourriez le faire maintenant.
Tout ce que vous devez faire est d’écrire une méthode d’extension qui prend Query et PageSize et PageNumber, puis vous devez ajouter le

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

ligne à la requête et exécuter.
Notez que la requête nécessite absolument une clause ORDER-BY (au moins dans T-SQL).
Cela fonctionnerait pour MS-SQL (2012+), PostgreSQL (8.4+) et Oracle (12c +).
Pour MySQL, vous devez ajouter le décalage LIMIT, page_size.

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

Pour Firebird, vous devez ajouter ROWS x TO y

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

Pour un index base-1, ce serait de startoffset_base1 à endoffset_base1

StartAt @PageSize * (pagenum - 1) + 1 EndAt @PageSize * (pagenum - 1) + @PageSize

Exemple:

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;

Pour la syntaxe sur différents SGBDR différents, voir
http://www.jooq.org/doc/3.5/manual/sql-building/sql-statements/select-statement/limit-clause/

Vérification:

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 



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi