在真實的項目開發中,可能有些人比較喜歡寫SQL語句,但是對於EF這種ORM框架比較排斥,那么輕量型的Dapper就是一個不錯的選擇,即讓你寫sql語句了,有進行了關系對象映射。其實對於EF吧,我說下我個人的見解,EF是相對來說比較重的ORM框架,它是講究通用性的框架,而非單純的實現某種需求的框架,不得不否認的說,EF的開發效率要比用單純的ADO.NET寫sql語句的效率高的不是一點半點,可能很多人會說EF的性能低等等,針對這種問題有時候是需要折中的來講,從另一個方面來講,你用了ADO.NET寫sql語句是性能好了,但是你得到的是弱類型的DataTable或者DataSet,常規在MVC的開發中,其實你難道不轉換成集合或者單個對象嗎?總不會拿着DataTable用吧,當你把弱類型的Datatable轉換成List<T>的時候,一般來講分兩種轉換,一種是利用反射,這其實也就成了關系對象映射了,跟ORM框架沒什么區別了,第二種無非是循環賦值了,但是這種的開箱裝箱的損耗也是很大的,最終你得到你想要的數據類型的時候其實折中算下來相比較EF直接得到,中間你又走了很多的彎路了,我在開發中一般EF打頭陣,輕量的Dapper做輔助,因為有時候開發效率很重要,性能的問題我不會過多在SQL優化上下功夫,我一般會在中間緩存上做處理。下面是我簡單的對Dapper的小包裝,代碼如下:
public class LiunianContext:IDisposable { private static readonly string _dbConnectionStr = ConfigurationManager.ConnectionStrings["XXXContext"].ConnectionString; private IDbConnection dbConnection; private IDbConnection DbConnection { get { if (_dbConnectionStr.IsNotNullOrEmpty()) dbConnection = new SqlConnection(_dbConnectionStr); else throw new ArgumentNullException("dbConnectionStr"); bool isClosed = dbConnection.State == ConnectionState.Closed; if (isClosed) dbConnection.Open(); return dbConnection; } } /// <summary> /// 執行增刪改操作(包括批量操作) /// </summary> /// <param name="sql">sql語句(有參數參數化)</param> /// <param name="param">參數化值</param> /// <returns></returns> public bool Execute(string sql, object param) { bool isSuccess = false; if (sql.IsNotNullOrEmpty()) { try { int result = DbConnection.Execute(sql, param); isSuccess = result > 0 ? true : false; } catch { isSuccess = false; } } return isSuccess; } /// <summary> /// 執行存儲過程操作 /// </summary> /// <param name="sql">存儲過程名稱</param> /// <param name="param">參數化值</param> /// <returns>返回存儲過程是否執行成功</returns> public bool ExecuteStored(string storedName, object param) { bool isSuccess = false; if (storedName.IsNotNullOrEmpty()) { try { int result = DbConnection.Execute(storedName, param, commandType: CommandType.StoredProcedure); isSuccess = result > 0 ? true : false; } catch { isSuccess = false; } } return isSuccess; } /// <summary> /// 執行存儲過程操作 /// </summary> /// <param name="storedName">存儲過程名稱</param> /// <param name="param">存儲過程參數</param> /// <returns>返回存儲過程要返回的值</returns> public DynamicParameters ExecuteStored(string storedName, DynamicParameters param) { if (storedName.IsNotNullOrEmpty()) { try { DbConnection.Execute(storedName, param, commandType: CommandType.StoredProcedure); } catch { } } return param; } /// <summary> /// 查詢操作 /// </summary> /// <typeparam name="T">返回集合的類型</typeparam> /// <param name="sql">sql語句</param> /// <param name="param">參數化值</param> /// <returns></returns> public IEnumerable<T> Query<T>(string sql, object param) { IEnumerable<T> _list = default(IEnumerable<T>); if (!string.IsNullOrEmpty(sql)) { try { _list = DbConnection.Query<T>(sql, param); } catch { } } return _list; } /// <summary> /// 執行存儲過程查詢操作 /// </summary> /// <typeparam name="T">返回集合的類型</typeparam> /// <param name="storedName">存儲過程</param> /// <param name="param">參數化值</param> /// <returns></returns> public IEnumerable<T> QueryStored<T>(string storedName, object param) { IEnumerable<T> _list = default(IEnumerable<T>); if (!string.IsNullOrEmpty(storedName)) { try { _list = DbConnection.Query<T>(storedName,commandType: CommandType.StoredProcedure); } catch { } } return _list; } /// <summary> /// 查詢操作返回默認第一條數據(如返回null則創建默認類型) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public T FirstOrDefault<T>(string sql, object param) { var model = default(T); if (!string.IsNullOrEmpty(sql)) { try { model = DbConnection.Query<T>(sql, param).FirstOrDefault(); } catch { } } return model ==