Пейджинг и сортировка 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. EF имеет "пропустить" и "взять", чтобы помочь в этом. Я понимаю, что микро ORM не имеет этого встроенного, но хотел бы знать, как это сделать.
Ответы
Ответ 1
Если вы хотите пропустить и взять с 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
Ответ 2
Вы можете сделать это сейчас.
Все, что вам нужно сделать, это написать метод расширения, который использует Query и PageSize и 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 offset, 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