上篇文章咱们介绍了,什么是Dapepr,有什么好处,性能的对比,还有多表多数据添加操做(事务的封装)等等。本篇文章咱们继续讲解。。。。。若是本篇文章看不懂,请看我上一篇文章:Dapeper的入门
Select查询
一、首先咱们先在SQLMapper中QueryMultiple()方法,在梳理Dapper中无心中发现,我的感受不错,
// // 摘要: // Execute a command that returns multiple result sets, and access each in turn:
// 上句话的翻译是: 执行一个返回多个结果集的命令,并依次访问每一个结果集
public static SqlMapper.GridReader QueryMultiple(this IDbConnection cnn, CommandDefinition command); // // 摘要: // Execute a command that returns multiple result sets, and access each in turn public static SqlMapper.GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null,
int? commandTimeout = null, CommandType? commandType = null); // // 摘要: // Execute a command that returns multiple result sets, and access each in turn public static Task<SqlMapper.GridReader> QueryMultipleAsync(this IDbConnection cnn, CommandDefinition command); // // 摘要: // Execute a command that returns multiple result sets, and access each in turn public static Task<SqlMapper.GridReader> QueryMultipleAsync(this IDbConnection cnn, string sql, object param = null,
IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);
二、老规矩咱们在DapperDBContext 中加个方法,咱们能够根据不一样业务扩展方法,sql
/// <summary> /// WueryMultiplie 执行一个返回多个结果集的命令,并依次访问每一个结果集 /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <param name="commandType"></param> /// <param name="databaseOption"></param> /// <returns></returns> public static Dapper.SqlMapper.GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null,
CommandType? commandType = null, int databaseOption = 1) { var conn = ConnectionFactory.MySqlConnection(); var sw = new Stopwatch(); sw.Start(); try { // 由于using 的做用域以后,链接自动关闭, //这里须要说明的是,在数据读取完毕以后,再也不须要SqlDataReader时,必须将其进行手动关闭 var restult = conn.QueryMultiple(sql, param, transaction, commandTimeout, commandType); sw.Stop(); return restult; } catch (Exception ex) { LogHelper.ErrorLog(ex.ToString()); throw new Exception(ex.ToString()); } }
注意事项:不知道你在上面代码中有没有遇到一个问题,上篇文章咱们封装用到using,此次没有用到,是由于封装过程报错:报错:“阅读器关闭时尝试调用 Read 无效” ,缘由也很简单:由于using 的做用域以后,链接自动关闭,这里须要说明的是,在数据读取完毕或者再也不须要SqlDataReader时,必须将其进行手动关闭。app
三、SQL调用性能
/// <summary> /// 单表查数据 /// </summary> /// <returns></returns> public List<Department> select() { string sql = @"select *from Department"; var list = DapperDBContext.Query<Department>(sql, null).ToList();
//(多个结果集)为了比较就写一块儿 var all = selectAll(); var dep = all.Read<Department>().ToList(); var auth = all.Read<AuthResources>().ToList(); return list; } /// <summary> /// 多个结果集 /// </summary> /// <returns></returns> public Dapper.SqlMapper.GridReader selectAll() { var sql = "select * from Department; select * from AuthResources"; var multiReader = DapperDBContext.QueryMultiple(sql); return multiReader; }