小巧玲珑。分页

问题描述 投票:46回答:5

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

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

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

2 - Dapper Query可以返回IQueryable吗?

谢谢你,米格尔

paging dapper
5个回答
35
投票

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

需要SQL Server 2005+

2)Dapper返回IEnumerable<T>


73
投票

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

SELECT * FROM [Posts]
ORDER BY [InsertDate]
OFFSET 20 ROWS
FETCH NEXT 5 ROWS ONLY

查看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);

3
投票

这是一个使用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;
    }

}

1
投票

我创建了一个示例项目来演示Dapper自定义分页,支持排序,条件和过滤:

https://github.com/jinweijie/Dapper.PagingSample

基本上,该方法如下所示:

 Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
        , int pageIndex
        , int pageSize
        , string[] asc
        , string[] desc);

第一个返回值是项目列表。第二个返回值是总计数。

希望能帮助到你。

谢谢。


-10
投票

如果您没有Sql Server 2012或者您有其他DBMS,则进行分页的一种方法是在DBMS和Web服务器或客户端之间拆分处理。 ---建议仅限小尺寸。您可以在Sql Server中使用'TOP'关键字,在MySql中使用LIMIT或在Oracle中使用ROWNUM来获取数据集中的最大行数。您将获取的行数等于您要跳过的行数加上您将采用的行数:

top = skip + take;

例如,你想要跳过100行并接下来的50行:

top = 100 + 50

所以你的SQL语句看起来像这样(SQL服务器风格)

SELECT    TOP 150 Name, Modified, content, Created
FROM      Posts
WHERE     Created >= '1900-01-01'

在客户端上:如果您使用的是.NET语言(如C#)并使用Dapper,则可以使用linq跳过多个行并执行多行,如下所示:

var posts = connection.Query<Post>(sqlStatement, dynamicParameters);
return posts?.ToList().Skip(skipValue).Take(takeValue);
© www.soinside.com 2019 - 2024. All rights reserved.