对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路。

分页需要三个变量:数据总量、每页显示的数据条数、当前页码。

//数据总量
int dataCount;
//每页显示的数据条数
int pageDataCount;
int pageNumber;

根据数据总量和每页显示的数据条数计算出总页数,根据当前页码和每页显示的数据条数计算出从数据库中读取数据的起始行号和结束行号。

//总页数
int pageCount = (int)Math.Ceiling(dataCount/ (pageDataCount* 1.0));
int startLine = (pageNumber - 1) * PageDataCount + 1;
int endLine=startLine + PageDataCount - 1;

对于数据库的查询操作使用轻量级ORM框架Dapper来实现,具体代码如下:

protected IDbConnection CreateConnection()
{
    IDbConnection dbConnection = new SqlConnection(ConnectionString);
    dbConnection.Open();
    return dbConnection;
}

//获取数据库中数据的总条数
public virtual int QueryDataCount(string tableName)
{
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<int>("select count(Id) from " + tableName);
        if (queryResult == null || !queryResult.Any())
        {
            return 0;
        }
        return queryResult.First();
    }
}

public virtual IEnumerable<T> RangeQuery<T>(string tableName, int startline, int endline)
{
    if (string.IsNullOrEmpty(tableName))
    {
        throw new ArgumentNullException("表名不得为空或null");
    }
    if (startline <= 0)
    {
        throw new ArgumentOutOfRangeException("起始行号必须大于0");
    }
    if (endline - startline < 0)
    {
        throw new ArgumentOutOfRangeException("结束行号不得小于起始行号");
    }
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<T>("select  top " + (endline - startline + 1) + " * from " + tableName + " where Id not in (select top " + (startline - 1) + " Id from " + tableName + " order by Id desc) order by Id desc");
        if (queryResult != null && queryResult.Any())
        {
            return queryResult;
        }
    }
    return null;
}
View Code

相关文章: