zoukankan      html  css  js  c++  java
  • sql 分页查询


    /// <summary>
    /// 获取分页数据(使用临时表):该方法在处理分页查询的时候使用了临时表技术,可以实现查询效率和页码大小无关,也就是说查询首页和查询尾页效率是相同的。
    /// 主要针对大数量下的大页码(尾页)的查询;但是小页码查询效率会有所降低。建议页码比较多的情况下应用此方法
    /// </summary>
    /// <param name="SqlMapID"></param>
    /// <param name="WebParas"></param>
    /// <param name="size">每页数据条数</param>
    /// <param name="pageNumber">指定页码</param>
    /// <returns></returns>
    public static Tuple<int, IEnumerable<T>> SqlMapGetPageList(string SqlMapID, Dictionary<string, string> WebParas, int size = 30, int pageNumber = 1, String ordeBySql = null)
    {

    Tuple<int, IEnumerable<T>> returnValue = default(Tuple<int, IEnumerable<T>>);
    try
    {
    using (IDbConnection _connection = new DataAccess().GetOpenConnection())
    {
    Dictionary<string, string> tempParas = new Dictionary<string, string>(WebParas);
    List<string> SqlParaList = new List<string>();
    string sqlStr = ReadSQLXml.CreatSqlParaSql(SqlMapID, tempParas, ref SqlParaList);
    var parameters = new DynamicParameters();
    foreach (var item in SqlParaList)
    {
    parameters.Add(item, tempParas[item]);
    }

    if (!String.IsNullOrWhiteSpace(sqlStr))
    {

    String paramPageSizeName = "@pageSize" + new Random().Next(1000, 9999);
    String paramPageIndexName = "@pageIndex" + new Random().Next(1000, 9999);

    String tmpTableName = "#tmpPageTable_" + Math.Abs(Guid.NewGuid().GetHashCode()).ToString() + new Random().Next(1000, 9999);
    String numberRowName = "RowNum_" + Math.Abs(Guid.NewGuid().GetHashCode()).ToString() + new Random().Next(1000, 9999);

    sqlStr = String.Format(@"
    SELECT ROW_NUMBER() OVER({1}) AS {5}, * INTO {4}
    FROM ({0}) tmp_page_table;
    select count(1) from {4} ;
    select * FROM {4} WHERE {5}> {2}*({3}-1) AND {5}<={3}*{2} {1};
    DROP TABLE {4} ;
    ", sqlStr,
    String.IsNullOrWhiteSpace(ordeBySql) ? "" : "ORDER BY " + ordeBySql,
    paramPageSizeName,
    paramPageIndexName,
    tmpTableName, numberRowName);
    parameters.Add(paramPageSizeName, size);
    parameters.Add(paramPageIndexName, pageNumber);

    using (var multi = _connection.QueryMultiple(sqlStr, parameters))
    {
    returnValue = new Tuple<int, IEnumerable<T>>(multi.Read<int>().First(), multi.Read<T>().ToList());
    }
    }

    return returnValue;
    }
    }
    catch (Exception e)
    {
    throw e;
    }
    }
    /// <summary>
    /// 获取分页数据(没使用临时表):该方法没有使用临时表。小页码(首页)查询效率会较高,但是大页码(尾页)查询会比小页码查询效率低。
    /// 主要针对小页码查询,建议页码比较少的情况下应用此方法
    /// </summary>
    /// <param name="SqlMapID"></param>
    /// <param name="WebParas"></param>
    /// <param name="size">每页数据条数</param>
    /// <param name="pageNumber">指定页码</param>
    /// <returns></returns>
    public static Tuple<int, IEnumerable<T>> SqlMapGetPageList_notemp(string SqlMapID, Dictionary<string, string> WebParas, int size = 30, int pageNumber = 1, String ordeBySql = null)
    {

    Tuple<int, IEnumerable<T>> returnValue = default(Tuple<int, IEnumerable<T>>);
    try
    {
    using (IDbConnection _connection = new DataAccess().GetOpenConnection())
    {
    Dictionary<string, string> tempParas = new Dictionary<string, string>(WebParas);
    List<string> SqlParaList = new List<string>();
    string sqlStr = ReadSQLXml.CreatSqlParaSql(SqlMapID, tempParas, ref SqlParaList);
    var parameters = new DynamicParameters();
    foreach (var item in SqlParaList)
    {
    parameters.Add(item, tempParas[item]);
    }

    if (!String.IsNullOrWhiteSpace(sqlStr))
    {

    String paramPageSizeName = "@pageSize" + new Random().Next(1000, 9999);
    String paramPageIndexName = "@pageIndex" + new Random().Next(1000, 9999);

    String tmpTableName = "#tmpPageTable_" + Math.Abs(Guid.NewGuid().GetHashCode()).ToString() + new Random().Next(1000, 9999);
    String numberRowName = "RowNum_" + Math.Abs(Guid.NewGuid().GetHashCode()).ToString() + new Random().Next(1000, 9999);

    sqlStr = String.Format(@"
    select count(1) from ({0}) as a;
    select * from (
    SELECT ROW_NUMBER() OVER({1}) AS {4}, *
    FROM ({0}) as a
    ) as b
    WHERE {4}> {2}*({3}-1) AND {4}<={3}*{2}
    ;
    ", sqlStr,
    String.IsNullOrWhiteSpace(ordeBySql) ? "" : "ORDER BY " + ordeBySql,
    paramPageSizeName,
    paramPageIndexName,
    numberRowName);
    parameters.Add(paramPageSizeName, size);
    parameters.Add(paramPageIndexName, pageNumber);

    using (var multi = _connection.QueryMultiple(sqlStr, parameters))
    {
    returnValue = new Tuple<int, IEnumerable<T>>(multi.Read<int>().First(), multi.Read<T>().ToList());
    }
    }

    return returnValue;
    }
    }
    catch (Exception e)
    {
    throw e;
    }
    }

  • 相关阅读:
    【LoadRunner-Vuser Generator】录制脚本设置Recording Options
    【LoadRunner-内部结构】
    【LoadRunner-工作过程】
    单片机上内存管理(重定义malloc free)的实现
    stm32模块的初始化顺序要求的更改设值
    [CAN波形分析] 一次CAN波形分析之旅
    w5500调试小记
    keil mdk中save和load指令,在调试中比较有用,以及hex格式的学习
    PHP启用session后抛 session_start(): open(/var/lib/php/session/sess_... 的解决办法
    brew 方式安装的php,关闭与重启----mac启动,关闭php-fpm方式
  • 原文地址:https://www.cnblogs.com/gfbppy/p/13775240.html
Copyright © 2011-2022 走看看