Dapper ORM Paging und Sortierung

dapper orm vb.net

Frage

Ich gebe dem Dapper ORM einen Versuch. Ich kann Daten aus einer Tabelle mit dem folgenden Code abfragen:

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)

Ich bin interessiert zu lernen, wie man mit Dapper blättert / sortiert. EF hat "skip" und "take", um dabei zu helfen. Ich verstehe, dass ein Mikro-ORM dies nicht eingebaut hat, aber würde gerne wissen, der beste Weg, dies zu erreichen.

Akzeptierte Antwort

Wenn Sie mit Dapper überspringen und aufnehmen möchten, tun Sie es mit 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

Beliebte Antwort

Du könntest es jetzt tun.
Sie müssen lediglich eine Erweiterungsmethode schreiben, die Query und PageSize und PageNumber akzeptiert. Anschließend müssen Sie die Datei anhängen

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

Linie zur Abfrage und ausführen.
Beachten Sie, dass die Abfrage unbedingt eine ORDER-BY-Klausel benötigt (zumindest in T-SQL).
Dies funktioniert für MS-SQL (2012+), PostgreSQL (8.4+) und Oracle (12c +).
Für MySQL müssten Sie LIMIT offset, page_size, anhängen.

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

Für Firebird müssten Sie ROWS x TO y hinzufügen

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

Für einen base-1-Index wäre dies von startoffset_base1 bis endoffset_base1

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

Beispiel:

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;

Informationen zur Syntax für verschiedene RDBMS finden Sie unter
http://www.jooq.org/doc/3.5/manual/sql-building/sql-statements/select-statement/limit-clause/

Überprüfung:

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 


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum