我正在尝试Dapper ORM,我正在查询帖子表。
但我想获得分页结果......
1 - 我该怎么做?这不是帮手吗?
2 - Dapper Query可以返回IQueryable吗?
谢谢你,米格尔
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>
。
您没有指定数据库或版本。如果您足够幸运能够使用全新的SQL Server 2012并且可以访问MSDN,则可以使用闪亮的新OFFSET
和FETCH
关键字。以下查询将跳过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);
这是一个使用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;
}
}
我创建了一个示例项目来演示Dapper自定义分页,支持排序,条件和过滤:
https://github.com/jinweijie/Dapper.PagingSample
基本上,该方法如下所示:
Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
, int pageIndex
, int pageSize
, string[] asc
, string[] desc);
第一个返回值是项目列表。第二个返回值是总计数。
希望能帮助到你。
谢谢。
如果您没有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);