2014-12-23 86 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连接