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