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
  • 相关阅读:
    MySQL实战45讲
    mysql查看binlog日志
    Nginx核心知识100讲
    RabbitMQ消息为什么变成数字了呢?
    Spring core中一些API
    [LeetCode] 719. Find K-th Smallest Pair Distance 找第K小的数对儿距离
    Github Upload Large File 上传超大文件
    [LeetCode] Special Binary String 特殊的二进制字符串
    [LeetCode] Range Module 范围模块
    [LeetCode] Find Anagram Mappings 寻找异构映射
  • 原文地址:https://www.cnblogs.com/LiuNew/p/10565005.html
Copyright © 2011-2022 走看看