zoukankan      html  css  js  c++  java
  • EF获取多个数据集以及MySQL分页数据查询优化

    背景:MySQL分页查询语句为

    SELECT * FROM TABLE LIMIT 0,10;

    一般页面还会获取总条数,这时候还需要一条查询总条数语句

    SELECT COUNT(*) FROM TABLE LIMIT 0,10

    这样数据库需要执行两次查询操作。MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的函数,FOUND_ROWS取得总条数。

    SELECT SQL_CALC_FOUND_ROWS * FROM TABLE LIMIT 0,10;
    SELECT FOUND_ROWS();

    上面SQL语句虽然有两个结果集,但只查询一次数据库,可以提升效率。

    在asp.net mvc项目中,ORM仅仅使用EF的话,处理两个结果集就有些复杂,下面这段代码可以解决

     1 /// <summary>
     2 /// 获取分页数据以及总条数(EF获取多个数据集)
     3 /// </summary>
     4 /// <typeparam name="T">实体类</typeparam>
     5 /// <param name="sql">SQL语句(分页查询+SELECT FOUND_ROWS查询)</param>
     6 /// <param name="parameters">SQL参数</param>
     7 /// <param name="db">数据库上下文</param>
     8 /// <param name="queryData">返回数据</param>
     9 /// <param name="rowCount">总行数</param>
    10 /// <param name="needReturnTotal">是否需要返回总行数</param>
    11 public void GetQueryDataAndRowCount<T>(string sql, List<MySqlParameter> parameters, DbContext db, out List<T> queryData, out int rowCount, bool needReturnTotal = true)
    12 {
    13     var data = new List<T>();
    14     var count = 0;
    15     try
    16     {
    17         var cmd = db.Database.Connection.CreateCommand();
    18         cmd.CommandText = sql;
    19         if (parameters.Count > 0)
    20         {
    21             cmd.Parameters.AddRange(parameters.ToArray());
    22         }
    23         db.Database.Connection.Open();
    24         var reader = cmd.ExecuteReader();
    25         if (reader.HasRows)
    26         {
    27             data = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reader).ToList();
    28             if (needReturnTotal)
    29             {
    30                 reader.NextResult();
    31                 count = ((IObjectContextAdapter)db).ObjectContext.Translate<int>(reader).FirstOrDefault();
    32             }
    33         }
    34     }
    35     finally
    36     {
    37         db.Database.Connection.Close();
    38     }
    39     queryData = data;
    40     rowCount = count;
    41 }
    View Code
  • 相关阅读:
    1289大鱼吃小鱼(STL中栈的应用)
    1347旋转字符串
    2133排队接水——优先队列
    7-37 整数分解为若干项之和(20 分)
    有一个VC的bug:非标准语法
    指针的一点点用法
    好久没写的博客_数组的长度等小问题
    解决strcmp的错误以及VS的快捷键
    输入流和注释
    VS出现异常?!和十进制转二进制比是小事
  • 原文地址:https://www.cnblogs.com/LiuNew/p/10565005.html
Copyright © 2011-2022 走看看