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

 

posted on 2019-03-20 15:04  cigarlau  阅读(707)  评论(0编辑  收藏  举报