分页查询
FillDateSet、ExecuteDataTable、ExecuteReader、ExecuteEnumerable 和 ExecuteAsyncEnumerable 方法都支持分页查询,它们都有一个 IDataSegment
类型的参数,典型的实现是 DataPager
类。如下所示:
[TestMethod]
public void TestByPager()
{
var sql = (SqlCommand)"select productid, productname from products";
var pager = new DataPager(50, 0); //每页50条数据,第一页开始(起始为0)
using (var db = DatabaseFactory.CreateDatabase())
{
foreach (var item in db.ExecuteEnumerable<Products>(sql, pager))
{
Console.WriteLine(item.ProductName);
}
}
}
使用 IDataSegment
参数后,会使用 SQL 语法服务 -- 分页语法 进行处理,生成的 SQL
会自动加上分页语法。
执行查询后,DataPager
对象的 RecordCount 属性返回总共查询到的记录数,PageCount 属性返回总页码数。
DataPager
类还有一个 Evaluator 属性,可以指定分页的评估策略。它是一个 IDataPageEvaluator
接口,默认有以下两种实现:
- TotalRecordEvaluator 总记录数评估方式
这是默认的策略,在返回结果集前,它会进行额外的一次查询,返回总记录数。
- TryNextEvaluator 尝试下一页评估方式
这种策略不会计算总记录数,所以不会返回总页码数,它每次会查询后面一页是否有记录。这种策略适用于数据量比较大,计算总记录数比较耗时的场景下,客户端不关心页码总数时可以采用。此时,RecordCount 并不是真实的记录数,而是一个虚构的数字。如下所示:
[TestMethod]
public void TestByEvaluator()
{
var sql = (SqlCommand)"select productid, productname from products";
var pager = new DataPager(50, 0); //每页50条数据,第一页开始(起始为0)
pager.Evaluator = new TryNextEvaluator();
using (var db = DatabaseFactory.CreateDatabase())
{
foreach (var item in db.ExecuteEnumerable<Products>(sql, pager))
{
Console.WriteLine(item.ProductName);
}
}
}