分页查询


  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);
        }
    }
}