有效处理数据库连接

时间:2014-12-23 12:58:32

标签: c# asp.net-mvc dapper

我在Dapper操作下面使用helper类。如果有多个实体要映射到复杂的DTO对象,我会单独检索它并手动附加到属性。

例如:要检索客户,我有一个带有订单和地址属性的Customer类。我知道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;
    }
}

2 个答案:

答案 0 :(得分:4)

SQLConnection automatically默认情况下使用连接池,因此只要正确处理连接,就不必担心网络连接开销。

答案 1 :(得分:1)

如果您知道QueryMultiple,为什么不将两个模型放在一个像

public class CustomerViewModel

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

然后当你调用Dapper.Query

将其映射为

 IEnumerable<CustomrerViewModel> list

这样只需要一个sql连接