2014-12-23 122 views
1

我正在使用下面的助手類進行Dapper操作。如果有多個實體映射到複雜的DTO對象,我將單獨檢索它並手動附加到屬性。高效地處理數據庫連接

例如:要檢索客戶,我有一個客戶類與訂單和地址屬性。我知道QueryMultiple方法,但實時我們有不同的查詢。

cust.Orders = DapperHelper.ExecList<OrderDTO>(qry1, params1); 
cust.Addresses = DapperHelper.ExecList<AddressDTO>(qry2, params2); 

我的疑問是,如果我打開連接來填充子項目,每次都會有任何性能問題。相反,我可以在構造函數中初始化連接,並在dispose方法中關閉它,從而爲每個請求使用單個連接。

public class DapperHelper 
    { 
     private static string _conn = Convert.ToString(ConfigurationManager.ConnectionStrings["dbContext"]); 


     public static IEnumerable<T> ExecList<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text, bool buffered = true) 
     { 
      IEnumerable<T> list; 
      using (IDbConnection _db = new SqlConnection(_conn)) 
      { 
       list = _db.Query<T>(query, param: cmdParams, commandTimeout: 0, commandType: cmdType, buffered: buffered); 
       _db.Close(); 
      } 
      return list; 
     } 

     public static T ExecSingleOrDefault<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) 
    { 
     T obj; 
     using (IDbConnection _db = new SqlConnection(_conn)) 
     { 
      obj = _db.Query<T>(query, param: cmdParams, commandTimeout: 0, commandType: cmdType).SingleOrDefault(); 
      _db.Close(); 
     } 
     return obj; 
    } 
} 
+0

如果你知道QueryMultiple爲什麼不把你的兩個模型放在一個。 – agentpx

+0

如前所述,有時候我們將無關數據填充到DTO的 – Sunny

+2

SQL Server連接保存在池中,因此在您的代碼中獲取新連接並不是一項昂貴的操作。一旦完成該操作,您應該始終關閉數據庫連接,並且不要試圖保持打開狀態以提高性能。 – JLRishe

回答

4

SQLConnectionautomatically默認情況下使用連接池,因此只要正確處理連接,就不必擔心網絡連接開銷。

1

如果你知道爲什麼QueryMultiple當你打電話不要將兩種模式在一個像

public class CustomerViewModel 

    List<Orders> orderList; 
    List<Address> addresslit; 
end class 

然後Dapper.Query

地圖作爲

IEnumerable<CustomrerViewModel> list 

這樣只需要一個sql連接