【问题标题】:Dapper ORM paging and sortingDapper ORM 分页和排序
【发布时间】:2011-08-20 13:49:26
【问题描述】:

我正在尝试使用 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 有“skip”和“take”来帮助解决这个问题。我知道微型 ORM 没有内置此功能,但想知道实现此功能的最佳方法。

【问题讨论】:

    标签: vb.net orm dapper


    【解决方案1】:

    如果您想跳过并使用 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
    

    【讨论】:

    • 是的,还要记住这是依赖于db的,oracle和mysql有limit和offset,denali有offset等等。
    • where 应该在内部查询中,不是吗?您可能应该在最终查询 (cc @Sam) 上有一个明确的 order by rownum
    • @Marc 是的,您需要在结束时订购.. 内部查询中可能需要也可能不需要 where,有时您可以在内部查询中添加 TOP @y 以获得性能提升
    • 你不会做 TOP (@pagesize) 而不是 TOP (@y) 吗? "@y" 将是绝对行号,而不是您想要的记录数?
    【解决方案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 偏移量 page_size。

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

    对于 Firebird,您必须将 ROWS x 附加到 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2012-08-23
      • 2012-03-14
      • 2012-05-10
      相关资源
      最近更新 更多