Пейджинг и сортировка Oapper 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;

line к запросу и выполнить.
Обратите внимание, что для запроса абсолютно требуется предложение ORDER-BY (по крайней мере, в T-SQL).
Это будет работать для MS-SQL (2012+), PostgreSQL (8.4+) и Oracle (12c +).
Для MySQL вам нужно добавить смещение LIMIT, page_size.

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

Для Firebird вам нужно добавить ROWS x TO 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 


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему