小巧玲珑.分页

Mig*_*ura 47 paging dapper

我正在尝试Dapper ORM,我正在查询帖子表.

但我想获得分页结果......

1 - 我该怎么做?这不是帮手吗?

2 - Dapper Query可以返回IQueryable吗?

谢谢你,米格尔

Jar*_*yer 73

您没有指定数据库或版本.如果你足够幸运,能够使用该品牌新的SQL Server 2012,并访问MSDN,您可以用崭新的OFFSETFETCH关键字.以下查询将跳过20条记录并返回下一条5条记录.

SELECT * FROM [Posts]
ORDER BY [InsertDate]
OFFSET 20 ROWS
FETCH NEXT 5 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请查看http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx#Offset.

此外,复制Massive的方式并为IDbConnection编写自己的扩展方法也很容易.这是Massive的代码.

var query = string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ", columns, pageSize, orderBy, TableName, where);
Run Code Online (Sandbox Code Playgroud)

  • 就我个人而言,我使用SqlBuilder这个东西,事实证明,非平凡的分页查询(尤其是涉及多映射的查询)需要特别小心才能获得高性能参见:http://samsaffron.com/archive/2011/09/05 /挖+自己+ OUT +的+乱七八糟+ LINQ的-2-SQL的+ +创建 (8认同)
  • 参数化该查询!! (6认同)
  • 也不要尽可能动态地包含列名之类的内容。它只是要求 SQL 注入。(对于像这样的高度可见的问题,我*绝对*不会在随机的互联网示例中使用这样的字符串格式。) (2认同)

Ale*_*lex 36

1)Dapper没有内置的分页功能.但是在查询中直接实现它并不困难.例:

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY InsertDate) AS RowNum, *
          FROM      Posts
          WHERE     InsertDate >= '1900-01-01'
        ) AS result
WHERE   RowNum >= 1 // *your pagination parameters
    AND RowNum < 20  //*
ORDER BY RowNum
Run Code Online (Sandbox Code Playgroud)

需要SQL Server 2005+

2)Dapper返回一个IEnumerable<T>.

  • 但如果它返回一个IEnumerable是不是这个关闭?我的意思是即使我将其更改为IQueryable,分页也将在内存中完成,而不是在SQL Server中完成.所以我认为你的方法更好...... (5认同)
  • 是的,IEnumerable <T>是"已关闭",并且没有到db上下文的链接,因为您可能从具有EF的IQueryable <T>上下文中知道它. (3认同)

Kbd*_*s07 6

这是使用 C# 和 Dapper 的完整工作版本。

/// <summary>
    /// Gets All People
    /// </summary>
    /// <returns>List of People</returns>
    public IEnumerable<Person> GetAllPeople(Pager pager)
    {
        var sql = (@" select * from [dbo].[Person]
                      order by [PeplNo]
                      OFFSET      @Offset ROWS 
                      FETCH NEXT  @Next   ROWS ONLY");

        using (IDbConnection cn = Connection)
        {
            cn.Open();

            var results = cn.Query<Person>(sql,pager);

            return results;
        }
    }


public class Pager
{
    public int Page { get; set; }
    public int PageSize { get; set; }

    public int Offset { get; set; }
    public int Next { get; set; }

    public Pager(int page, int pageSize = 10)
    {
        Page = page < 1 ? 1 : page;
        PageSize = pageSize < 1 ? 10 : pageSize;

        Next = pageSize;
        Offset = (Page - 1) * Next;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的示例,因为它使用查询参数化。得票最高的答案很容易受到 SQL 注入攻击。https://owasp.org/www-community/attacks/SQL_Injection (2认同)