2019年做項目使用的數據訪問層都是基於dapper.net和DapperExtensions基礎上加以封裝,個人感覺非常的好用。學習起來沒有什么成本、簡單、清理、靈活,但也有很多缺點 就是DapperExtensions(orm) 擴展 很久沒有更新了,多表查詢個人感覺不是很好用。比如更新要更新指定的屬性,需要到源碼里面去改動(有可能是我還沒有找到用法,如果哪位知道請告訴我下(非常的感謝))。下面我我將把自己封裝的數據庫訪問層代碼貼上來,不足的、錯誤的希望給予指正,相互學習相互進步。
首先是接口封裝:
using DapperExtensions; using DapperExtensions.Mapper; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Com.Marecente.DbHelper { /// <summary> /// 數據訪問層接口 /// </summary> public interface ISqlHelper { /// <summary> /// 是否使用事務 /// </summary> bool HasActiveTransaction { get; } /// <summary> /// 數據庫連接 Connection 對象 /// </summary> IDbConnection Connection { get; } /// <summary> /// 指定事務的隔離級別,默認 /// </summary> /// <param name="isolationLevel">不可以在事務期間讀取可變數據,但是可以修改</param> void BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted); /// <summary> /// 提交事務 /// </summary> void Commit(); /// <summary> /// 事務回滾 /// </summary> void Rollback(); /// <summary> /// 執行一個事物 Action 的寫法 /// </summary> /// <param name="action">委托(Action)</param> void RunInTransaction(Action action); /// <summary> /// 執行一個事物 Func<T> 的寫法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="func"></param> /// <returns></returns> T RunInTransaction<T>(Func<T> func); /// <summary> /// 獲取一個對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="id">dynamic</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns></returns> T Get<T>(dynamic id, int? commandTimeout = null) where T : class; /// <summary> /// 新增對象(無返回值) /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entities">泛型集合</param> /// <param name="commandTimeout">sql超時時間</param> void Insert<T>(IEnumerable<T> entities, int? commandTimeout = null) where T : class; /// <summary> /// 新增對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">泛型參數·</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns></returns> dynamic Insert<T>(T entity, int? commandTimeout = null) where T : class; /// <summary> /// 更新對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">更新對象</param> /// <param name="updateProperties">更新的屬性</param> /// <param name="commandTimeout">sql超時時間</param> /// <param name="ignoreAllKeyProperties"></param> /// <returns>bool</returns> bool Update<T>(T entity, List<string> updateProperties = null, int? commandTimeout = null, bool ignoreAllKeyProperties = false) where T : class; /// <summary> /// /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">刪除對象</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns></returns> bool Delete<T>(T entity, int? commandTimeout = null) where T : class; /// <summary> /// 根據條件刪除對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="predicate">條件</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns></returns> bool Delete<T>(object predicate, int? commandTimeout = null) where T : class; /// <summary> /// /// </summary> /// <typeparam name="T">指定獲取的類型</typeparam> /// <param name="predicate">查詢條件</param> /// <param name="sort">排序</param> /// <param name="commandTimeout">sql超時時間</param> /// <param name="buffered"></param> /// <returns></returns> IEnumerable<T> GetList<T>(object predicate = null, IList<ISort> sort = null, int? commandTimeout = null, bool buffered = true) where T : class; /// <summary> /// /// </summary> /// <typeparam name="T">指定獲取的類型</typeparam> /// <param name="predicate">查詢條件</param> /// <param name="sort">排序</param> /// <param name="page"></param> /// <param name="resultsPerPage"></param> /// <param name="commandTimeout"></param> /// <param name="buffered"></param> /// <returns></returns> IEnumerable<T> GetPage<T>(object predicate, IList<ISort> sort, int page, int resultsPerPage, int? commandTimeout = null, bool buffered = true) where T : class; /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="sort"></param> /// <param name="firstResult"></param> /// <param name="maxResults"></param> /// <param name="commandTimeout"></param> /// <param name="buffered"></param> /// <returns></returns> IEnumerable<T> GetSet<T>(object predicate, IList<ISort> sort, int firstResult, int maxResults, int? commandTimeout, bool buffered) where T : class; /// <summary> /// 聚合函數 Count /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="commandTimeout"></param> /// <returns></returns> int Count<T>(object predicate, int? commandTimeout = null) where T : class; /// <summary> /// 返回多個結果集 /// </summary> /// <param name="predicate"></param> /// <param name="commandTimeout"></param> /// <returns></returns> IMultipleResultReader GetMultiple(GetMultiplePredicate predicate, int? commandTimeout = null); /// <summary> /// 清除緩存 /// </summary> void ClearCache(); /// <summary> /// 生成GUID對象 /// </summary> /// <returns></returns> Guid GetNextGuid(); /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> IClassMapper GetMap<T>() where T : class; /// <summary> /// 釋放資源 /// </summary> void Dispose(); #region sql 語句 /// <summary> /// 獲取第一個字段第一個值(sql) /// </summary> /// <typeparam name="T">泛型對象</typeparam> /// <param name="sql">sql</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T GetValue<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// 獲取list泛型集合 /// </summary> /// <typeparam name="T">泛型對象</typeparam> /// <param name="sql">sql語句</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> Query<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// 返回動態的 Dictionary 泛型 /// </summary> /// <typeparam name="T1">泛型對象1</typeparam> /// <typeparam name="T2">泛型對象2</typeparam> /// <param name="sql">sql語句</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>Dictionary<T1, T2></returns> Dictionary<dynamic, dynamic> GetDic<T1, T2>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// Dictionary<string, dynamic> sql /// </summary> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>Dictionary<string, dynamic></returns> Dictionary<string, dynamic> GetFirstValues(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// GetModel<T> sql /// </summary> /// <typeparam name="T">T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T GetModel<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) where T : class; /// <summary> /// GetModelList<T> /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> GetModelList<T>(string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) where T : class; /// <summary> /// GetDynamicModel<T> sql /// </summary> /// <typeparam name="T">泛型T</typeparam> /// <param name="buildModelFunc">buildModelFunc</param> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>GetDynamicModel</returns> T GetDynamicModel<T>(Func<IEnumerable<dynamic>, T> buildModelFunc, string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// GetMultModelList<T> sql /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="types">types</param> /// <param name="map">map</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="splitOn">splitOn</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> GetMultModelList<T>(string sql, Type[] types, Func<object[], T> map, object param = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// ExecuteCommand sql /// </summary> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>bool</returns> bool ExecuteCommand(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary> /// ExecuteScalar<T> sql /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T ExecuteScalar<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null); #endregion } }
實現接口:
using DapperExtensions; using DapperExtensions.Mapper; using DapperExtensions.Sql; using System; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; using System.Data.SqlClient; using System.Data.SQLite; using System.Linq; using System.Reflection; namespace Com.Marecente.DbHelper { public class SqlHelper : ISqlHelper { private readonly IDapperImplementor _dapper; private IDbTransaction _transaction; /// <summary> /// 訪問數據庫實例 /// </summary> public static SqlHelper System { get { return new SqlHelper(); } } /// <summary> /// 構造函數 SqlHelper /// </summary> public SqlHelper() { var connectionString = Com.Marecente.Util.Config.GetValue("System_ConnectionString"); var dbtype = Com.Marecente.Util.ObjHelper.GetDBType(); if (dbtype == Util.DBType.SQLite) { Connection = new SQLiteConnection(connectionString); var config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new SqliteDialect()); _dapper = new DapperImplementor(new SqlGeneratorImpl(config)); } else if (dbtype == Util.DBType.SQLServer) { var connection = new SqlConnection(connectionString); var config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new SqlServerDialect()); var sqlGenerator = new SqlGeneratorImpl(config); _dapper = new DapperImplementor(sqlGenerator); Connection = connection; } else if (dbtype == Util.DBType.Oracle) { var connection = new OracleConnection(connectionString); var config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new OracleDialect()); var sqlGenerator = new SqlGeneratorImpl(config); _dapper = new DapperImplementor(sqlGenerator); Connection = connection; } else if (dbtype == Util.DBType.MySql) { //var connection = new MySqlConnection("Server=localhost;Port=3306;Database=dapperTest;uid=root;password=password!"); //var config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new MySqlDialect()); //var sqlGenerator = new SqlGeneratorImpl(config); //_dapper = new DapperImplementor(sqlGenerator); //Connection = connection; } if (Connection.State != ConnectionState.Open) { Connection.Open(); } } /// <summary> /// 是否執行了事物 /// </summary> public bool HasActiveTransaction { get { return _transaction != null; } } public IDbConnection Connection { get; private set; } /// <summary> /// 資源釋放 /// </summary> public virtual void Dispose() { if (Connection.State != ConnectionState.Closed) { if (_transaction != null) { _transaction.Rollback(); } Connection.Close(); } } #region orm /// <summary> /// 指定事務的隔離級別,默認 /// </summary> /// <param name="isolationLevel">不可以在事務期間讀取可變數據,但是可以修改</param> public void BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted) { _transaction = Connection.BeginTransaction(isolationLevel); } /// <summary> /// 提交事務 /// </summary> public void Commit() { _transaction.Commit(); _transaction = null; } /// <summary> /// 事務回滾 /// </summary> public void Rollback() { _transaction.Rollback(); _transaction = null; } /// <summary> /// 執行一個事物 Action 的寫法 /// </summary> /// <param name="action">委托(Action)</param> public void RunInTransaction(Action action) { BeginTransaction(); try { action(); Commit(); } catch (Exception ex) { if (HasActiveTransaction) { Rollback(); } throw ex; } } /// <summary> /// 執行一個事物 Func<T> 的寫法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="func"></param> /// <returns></returns> public T RunInTransaction<T>(Func<T> func) { BeginTransaction(); try { T result = func(); Commit(); return result; } catch (Exception ex) { if (HasActiveTransaction) { Rollback(); } throw ex; } } /// <summary> /// 獲取一個對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="id">dynamic</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns>T</returns> public T Get<T>(dynamic id, int? commandTimeout) where T : class { return (T)_dapper.Get<T>(Connection, id, _transaction, commandTimeout); } /// <summary> /// 新增對象(無返回值) /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entities">泛型集合</param> /// <param name="commandTimeout">sql超時時間</param> public void Insert<T>(IEnumerable<T> entities, int? commandTimeout) where T : class { _dapper.Insert<T>(Connection, entities, _transaction, commandTimeout); } /// <summary> /// 新增對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">泛型參數·</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns>dynamic</returns> public dynamic Insert<T>(T entity, int? commandTimeout) where T : class { return _dapper.Insert<T>(Connection, entity, _transaction, commandTimeout); } /// <summary> /// 更新對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">更新對象</param> /// <param name="updateProperties">更新的屬性</param> /// <param name="commandTimeout">sql超時時間</param> /// <param name="ignoreAllKeyProperties"></param> /// <returns>bool</returns> public bool Update<T>(T entity, List<string> updateProperties, int? commandTimeout, bool ignoreAllKeyProperties = false) where T : class { return _dapper.Update<T>(Connection, entity, updateProperties, _transaction, commandTimeout, ignoreAllKeyProperties); } /// <summary> /// 刪除對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="entity">刪除對象</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns>bool</returns> public bool Delete<T>(T entity, int? commandTimeout) where T : class { return _dapper.Delete(Connection, entity, _transaction, commandTimeout); } /// <summary> /// 根據條件刪除對象 /// </summary> /// <typeparam name="T">參數類型</typeparam> /// <param name="predicate">條件</param> /// <param name="commandTimeout">sql超時時間</param> /// <returns>bool</returns> public bool Delete<T>(object predicate, int? commandTimeout) where T : class { return _dapper.Delete<T>(Connection, predicate, _transaction, commandTimeout); } /// <summary> /// 獲取列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="sort"></param> /// <param name="commandTimeout"></param> /// <param name="buffered"></param> /// <returns>IEnumerable<T></returns> public IEnumerable<T> GetList<T>(object predicate, IList<ISort> sort, int? commandTimeout, bool buffered) where T : class { return _dapper.GetList<T>(Connection, predicate, sort, _transaction, commandTimeout, false); } /// <summary> /// 獲取列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="sort"></param> /// <param name="page"></param> /// <param name="resultsPerPage"></param> /// <param name="commandTimeout"></param> /// <param name="buffered"></param> /// <returns>IEnumerable<T></returns> public IEnumerable<T> GetPage<T>(object predicate, IList<ISort> sort, int page, int resultsPerPage, int? commandTimeout, bool buffered) where T : class { return _dapper.GetPage<T>(Connection, predicate, sort, page, resultsPerPage, _transaction, commandTimeout, buffered); } /// <summary> /// 獲取列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="sort"></param> /// <param name="firstResult"></param> /// <param name="maxResults"></param> /// <param name="commandTimeout"></param> /// <param name="buffered"></param> /// <returns>IEnumerable<T></returns> public IEnumerable<T> GetSet<T>(object predicate, IList<ISort> sort, int firstResult, int maxResults, int? commandTimeout, bool buffered) where T : class { return _dapper.GetSet<T>(Connection, predicate, sort, firstResult, maxResults, _transaction, commandTimeout, buffered); } /// <summary> /// 聚合函數 Count /// </summary> /// <typeparam name="T"></typeparam> /// <param name="predicate"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public int Count<T>(object predicate, int? commandTimeout) where T : class { return _dapper.Count<T>(Connection, predicate, _transaction, commandTimeout); } /// <summary> /// 返回多個結果集 /// </summary> /// <param name="predicate"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public IMultipleResultReader GetMultiple(GetMultiplePredicate predicate, int? commandTimeout) { return _dapper.GetMultiple(Connection, predicate, _transaction, commandTimeout); } /// <summary> /// 清除緩存 /// </summary> public void ClearCache() { _dapper.SqlGenerator.Configuration.ClearCache(); } /// <summary> /// 生成GUID對象 /// </summary> /// <returns></returns> public Guid GetNextGuid() { return _dapper.SqlGenerator.Configuration.GetNextGuid(); } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public IClassMapper GetMap<T>() where T : class { return _dapper.SqlGenerator.Configuration.GetMap<T>(); } #endregion #region sql語句 /// <summary> /// 獲取第一個字段第一個值(sql) /// </summary> /// <typeparam name="T">泛型對象</typeparam> /// <param name="sql">sql</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T ISqlHelper.GetValue<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { return Dapper.SqlMapper.ExecuteScalar<T>(Connection, sql, param, _transaction, commandTimeout, commandType); } /// <summary> /// 獲取list泛型集合 /// </summary> /// <typeparam name="T">泛型對象</typeparam> /// <param name="sql">sql語句</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> ISqlHelper.Query<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { return Dapper.SqlMapper.Query<T>(Connection, sql, param, _transaction, true, commandTimeout, commandType).ToList(); } /// <summary> /// 返回動態的 Dictionary 泛型 /// </summary> /// <typeparam name="T1">泛型對象1</typeparam> /// <typeparam name="T2">泛型對象2</typeparam> /// <param name="sql">sql語句</param> /// <param name="param">查詢參數</param> /// <param name="commandTimeout">超時時間</param> /// <param name="commandType">commandType</param> /// <returns>Dictionary<T1, T2></returns> Dictionary<dynamic, dynamic> ISqlHelper.GetDic<T1, T2>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { var dict = Dapper.SqlMapper.Query(Connection, sql, param, _transaction, true, commandTimeout, commandType).ToDictionary( row => (dynamic)row.ID, row => (dynamic)row.Name); return dict; } /// <summary> /// Dictionary<string, dynamic> sql /// </summary> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>Dictionary<string, dynamic></returns> Dictionary<string, dynamic> ISqlHelper.GetFirstValues(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { Dictionary<string, dynamic> firstValues = new Dictionary<string, dynamic>(); List<string> indexColNameMappings = new List<string>(); int rowIndex = 0; using (var reader = Dapper.SqlMapper.ExecuteReader(Connection, sql, param, _transaction, commandTimeout, commandType)) { while (reader.Read()) { if ((++rowIndex) > 1) break; if (indexColNameMappings.Count == 0) { for (int i = 0; i < reader.FieldCount; i++) { indexColNameMappings.Add(reader.GetName(i)); } } for (int i = 0; i < reader.FieldCount; i++) { firstValues[indexColNameMappings[i]] = reader.GetValue(i); } } reader.Close(); } return firstValues; } /// <summary> /// GetModel<T> sql /// </summary> /// <typeparam name="T">T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T ISqlHelper.GetModel<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { return Dapper.SqlMapper.QueryFirstOrDefault<T>(Connection, sql, param, _transaction, commandTimeout, commandType); } /// <summary> /// GetModelList<T> /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> ISqlHelper.GetModelList<T>(string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { var list = Dapper.SqlMapper.Query<T>(Connection, sql, param, _transaction, buffered, commandTimeout, commandType).ToList(); if (list == null) { list = new List<T>(); } return list; } /// <summary> /// GetDynamicModel<T> sql /// </summary> /// <typeparam name="T">泛型T</typeparam> /// <param name="buildModelFunc">buildModelFunc</param> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>GetDynamicModel</returns> T ISqlHelper.GetDynamicModel<T>(Func<IEnumerable<dynamic>, T> buildModelFunc, string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { return default(T); } /// <summary> /// GetMultModelList<T> sql /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="types">types</param> /// <param name="map">map</param> /// <param name="param">param</param> /// <param name="buffered">buffered</param> /// <param name="splitOn">splitOn</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>List<T></returns> List<T> ISqlHelper.GetMultModelList<T>(string sql, Type[] types, Func<object[], T> map, object param = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return Dapper.SqlMapper.Query<T>(Connection, sql, types, map, param, _transaction, buffered, splitOn, commandTimeout, commandType).ToList(); } /// <summary> /// ExecuteCommand sql /// </summary> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>bool</returns> bool ISqlHelper.ExecuteCommand(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { int result = Dapper.SqlMapper.Execute(Connection, sql, param, _transaction, commandTimeout, commandType); return (result > 0); } /// <summary> /// ExecuteScalar<T> sql /// </summary> /// <typeparam name="T">泛型參數T</typeparam> /// <param name="sql">sql</param> /// <param name="param">param</param> /// <param name="commandTimeout">commandTimeout</param> /// <param name="commandType">commandType</param> /// <returns>T</returns> T ISqlHelper.ExecuteScalar<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) { T result = Dapper.SqlMapper.ExecuteScalar<T>(Connection, sql, param, _transaction, commandTimeout, commandType); return result; } #endregion } }
其中更新的地方有一個參數:List<string> updateProperties 這里我改動了 DapperExtensions插件的源碼,在該類中:DapperImplementor 中的 Update 方法中204行增加如下代碼:
if (updateProperties != null) { var l = new List<IPropertyMap>(); foreach (var item in classMap.Properties) { if (item.Name == "ID") continue; var res = updateProperties.Contains(item.ColumnName); if (!res) { l.Add(item); } } if (l.Count > 0) { foreach (var item in l) { // 移除不需要修改的屬性 classMap.Properties.Remove(item); } } }
如圖:
使用只測試了幾個:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Com.Marecente.DbHelper.ISqlHelper sqlHelper = Com.Marecente.DbHelper.SqlHelper.System; #region 新增 // int id = sqlHelper.Insert<Test>(new Test { Name = "小王", Age = 18 }); #endregion // var test = sqlHelper.Get<Test>(1); #region 新增使用事務測試(測試回滾) //sqlHelper.BeginTransaction(); //try //{ // int id = sqlHelper.Insert<Test>(new Test { Name = "事務測試", Age = 18 }); // sqlHelper.Commit(); //} //catch (Exception ex) //{ // sqlHelper.Rollback(); //} #endregion } } public class Test { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } }
該訪問層我只測試了sql server、sqlite,其他還支持MySql (未測試)等,不足的地方歡迎指正。