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

 

转载于:https://www.cnblogs.com/LiuNew/p/10565005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值