首页 > 数据库技术 > 详细

EF获取多个数据集以及MySQL分页数据查询优化

时间:2019-03-20 15:38:44      阅读:152      评论:0      收藏:0      [点我收藏+]

背景: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

 

EF获取多个数据集以及MySQL分页数据查询优化

原文:https://www.cnblogs.com/LiuNew/p/10565005.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!