2011-05-07 34 views
15

Tôi đang thử dùng ORM Dapper. Tôi có thể truy vấn dữ liệu từ một bảng bằng cách sử dụng mã bên dưới:Phân trang và phân loại 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) 

Tôi muốn tìm hiểu cách phân trang/sắp xếp bằng Dapper. EF đã "bỏ qua" và "thực hiện" để trợ giúp vấn đề này. Tôi hiểu rằng một ORM vi không có được xây dựng trong nhưng muốn biết cách tốt nhất để thực hiện điều này.

Trả lời

19

Nếu bạn muốn bỏ qua và thực hiện với Dapper, you do it with 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

có, cũng cần ghi nhớ này được db phụ thuộc, oracle và mysql có giới hạn và bù đắp, Denali đã bù đắp và vân vân. –

+1

** nơi ** nên ở bên trong truy vấn bên trong, phải không? Và bạn có lẽ nên có một trật tự ** rõ ràng bởi rownum ** trên truy vấn cuối cùng (cc @Sam) –

+1

@Marc có bạn sẽ cần một đơn đặt hàng vào lúc đó kết thúc .. nơi có thể hoặc có thể không cần thiết trong truy vấn bên trong , đôi khi bạn có thể thêm TOP @y vào truy vấn bên trong để tăng mức hoàn hảo –

0

Bạn có thể làm ngay bây giờ.
Tất cả các bạn cần phải làm là viết một phương pháp mở rộng mà sẽ đưa Query và PageSize và PAGENUMBER, sau đó bạn cần phải thêm dòng

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

với truy vấn và thực hiện.
Lưu ý rằng truy vấn hoàn toàn yêu cầu mệnh đề ORDER-BY (ít nhất là trong T-SQL).
Điều này sẽ làm việc cho MS-SQL (2012+), PostgreSQL (8.4+) và Oracle (12c +).
Đối với MySQL, bạn phải thêm LIMIT offset, page_size.

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

Đối với Firebird, bạn phải nối thêm ROWS x ĐẾN y

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

Đối với một số cơ sở-1, nó sẽ là từ startoffset_base1 để endoffset_base1

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

Ví dụ:

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; 

Đối với cú pháp trên RDBMS khác nhau khác nhau, xem
http://www.jooq.org/doc/3.5/manual/sql-building/sql-statements/select-statement/limit-clause/

Mã xác nhận:

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 
Các vấn đề liên quan