需要引入包:
Dapper Dapper.Contrib
接口代码:
/// <summary> /// Dapper上下文 /// </summary> public interface IDapperContext : IDisposable { /// <summary> /// 数据库连接对象 /// </summary> IDbConnection Connection { get; } }
/// <summary> /// 数据库CRUD等操作 /// </summary> /// <typeparam name="T"></typeparam> public interface IRepository<T> where T : class { /// <summary> /// 连接 /// </summary> IDbConnection Connection { get; } /// <summary> /// 上下文 /// </summary> IDapperContext Context { get; } /// <summary> /// 设置上下文连接字符串 /// </summary> /// <param name="connectionString">字符串</param> void SetContext(string connectionString); /// <summary> /// 重置上下文,用appSetting.json里的数据库连接串 /// </summary> void ResetContext(); /// <summary> /// 获取分页数据 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="criteria">查询设置</param> /// <param name="param"></param> /// <returns></returns> PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class; /// <summary> /// 根据主键获取数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> T GetByKey<T>(object key, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// <summary> /// 添加数据 /// </summary> /// <param name="entity"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// /// </summary> /// <param name="entity"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 删除单条数据 /// </summary> /// <param name="entity"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 根据主键获取数据 /// </summary> /// <param name="key"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> T GetByKey(object key, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 获取所有数据 /// </summary> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 根据条件获取数据列表 /// </summary> /// <param name="where"></param> /// <param name="order"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null); IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// <summary> /// 查询数据列表 /// </summary> /// <param name="sql"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 查询数据列表 /// </summary> /// <param name="sql"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// <summary> /// 查询数据列表 /// </summary> /// <typeparam name="TFirst"></typeparam> /// <typeparam name="TSecond"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="sql"></param> /// <param name="map"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// 查询数据列表 /// </summary> /// <typeparam name="TFirst"></typeparam> /// <typeparam name="TSecond"></typeparam> /// <typeparam name="TThird"></typeparam> /// <typeparam name="TFourth"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="sql"></param> /// <param name="map"></param> /// <param name="param"></param> /// <param name="transaction"></param> /// <param name="splitOn"></param> /// <param name="commandTimeout"></param> /// <param name="commandType"></param> /// <returns></returns> IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// 执行sql /// </summary> /// <param name="sql"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary> /// 返回单个参数 /// </summary> /// <param name="sql"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); }
实现:
public class DapperContext : IDapperContext { /// <summary> /// 连接字符串 /// </summary> private string _connectionString; private bool _useMiniProfiling; /// <summary> /// 连接 /// </summary> private IDbConnection _connection; ///// <summary> ///// 节点对象 ///// </summary> //private readonly AppSetting _appSetting; /// <summary> /// 构造函数注入IOptions /// </summary> /// <param name="appSetting"></param> public DapperContext(IConfiguration configuration) { _connectionString = configuration["AppSetting:ConnectionString"]; _useMiniProfiling = bool.Parse(configuration["AppSetting.UseMiniProfiling"]); } /// <summary> /// 连接字符串,用于各个公司 /// </summary> /// <param name="connectionString"></param> public DapperContext(string connectionString) { _connectionString = connectionString; } /// <summary> /// 获取连接 /// </summary> public IDbConnection Connection { get { if (_connection == null || _connection.State == ConnectionState.Closed) { if (_useMiniProfiling) { _connection = new ProfiledDbConnection(new SqlConnection(_connectionString), MiniProfiler.Current); } else { _connection = new SqlConnection(_connectionString); } } if (_connection.State != ConnectionState.Open) { //Console.WriteLine("数据库连接:" + _connectionString); _connection.Open(); } return _connection; } } /// <summary> /// 释放连接 /// </summary> public void Dispose() { if (_connection != null && _connection.State == ConnectionState.Open) _connection.Close(); } }
public class Repository<T> : IRepository<T> where T : class { public IDbConnection Connection { get { return Context.Connection; } } /// <summary> /// 存储appsetting.json里的数据库连接字符串 /// </summary> private string _connectionString; public IDapperContext Context { get; private set; } public Repository(IDapperContext context) { Context = context; _connectionString = context.Connection.ConnectionString; } /// <summary> /// 设置上下文连接字符串 /// </summary> /// <param name="connectionString"></param> public void SetContext(string connectionString) { Context.Dispose(); Context = new DapperContext(connectionString); } /// <summary> /// 重置上下文,用appSetting.json里的数据库连接串 /// </summary> public void ResetContext() { SetContext(_connectionString); } public PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class { var p = new DynamicParameters(); string proName = "CCHRWebApiProcGetPageData"; p.Add("TableName", criteria.TableName); p.Add("PrimaryKey", criteria.PrimaryKey); p.Add("Fields", criteria.Fields); p.Add("Condition", criteria.Condition); p.Add("CurrentPage", criteria.CurrentPage); p.Add("PageSize", criteria.PageSize); p.Add("Sort", criteria.Sort); p.Add("RecordCount", dbType: DbType.Int32, direction: ParameterDirection.Output); var pageData = new PageDataView<TEntity>(); int excuteTimes = 0; //QUERY: try { pageData.Items = Connection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout:300).ToList(); pageData.TotalNum = p.Get<int>("RecordCount"); pageData.TotalPageCount = Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize)); pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage; } catch (Exception e) { excuteTimes++; if (e.Message.Contains("找不到存储过程 'CCHRWebApiProcGetPageData'") && excuteTimes <= 3) { FileStream fileStream = new FileStream(@"SqlCCHRWebApiProcGetPageData.sql", FileMode.Open); StreamReader sr = new StreamReader(fileStream); string sql = sr.ReadToEnd(); if (fileStream != null) fileStream.Close(); if (sr != null) sr.Close(); if (!string.IsNullOrEmpty(sql)) { Connection.Execute(sql); // goto QUERY; } throw; } else if ((e.Message.Contains("远程主机强迫关闭了一个现有的连接") || e.Message.Contains("指定的网络名不再可用")) && excuteTimes <= 3) { System.Threading.Thread.Sleep(excuteTimes * 1000); //goto QUERY; } else { throw; } } return pageData; } public virtual T GetByKey<T>(object id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { if (id == null) { throw new ArgumentNullException("id"); } return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout); } public long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null) { if (entity == null) { throw new ArgumentNullException("entity", "Add to DB null entity"); } var res = Connection.Insert(entity, transaction: transaction, commandTimeout: commandTimeout); return res; } public virtual void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null) { if (entity == null) { throw new ArgumentNullException("entity", "Update in DB null entity"); } Connection.Update(entity, transaction: transaction, commandTimeout: commandTimeout); } public virtual void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null) { if (entity == null) { throw new ArgumentNullException("entity", "Remove in DB null entity"); } Connection.Delete(entity, transaction: transaction, commandTimeout: commandTimeout); } public virtual T GetByKey(object id, IDbTransaction transaction = null, int? commandTimeout = null) { if (id == null) { throw new ArgumentNullException("id"); } return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout); } public virtual IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.GetAll<T>(transaction: transaction, commandTimeout: commandTimeout); } public virtual T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { return Connection.QuerySingleOrDefault<T>(sql, param, transaction: transaction, commandTimeout: commandTimeout); } public virtual IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.Query<T>(where.ToString(), commandTimeout:commandTimeout); } public virtual IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { return Connection.Query<T>(sql.ToString(), param: param, transaction: transaction, commandTimeout: commandTimeout); } public IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.Query<dynamic>(sql); } public IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { return Connection.Query<T>(sql, param: param, transaction: transaction); } public IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TThird, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TThird, TFourth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType); } public int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.Execute(sql, param: param, transaction: transaction); } public object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.ExecuteScalar(sql, param: param, transaction: transaction, commandTimeout: commandTimeout); } public GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { return Connection.QueryMultiple(sql, param: param, transaction: transaction, commandTimeout: commandTimeout); } }