Dapper如何使用泛型<T>执行来自不同文件的多表查询请求
Dapper通用数据访问封装修复及使用方案
一、原有封装代码修复
你现有代码存在一处语法错误:connection.Query<T>(string, object) 属于参数传值错误,需要替换为方法入参的query和parameters,同时可优化连接字符串的可配置性,避免硬编码。修正后完整代码如下:
using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Configuration; using Dapper; namespace DBConnector { public static class Helper { public static string CnnVal(string name) { return ConfigurationManager.ConnectionStrings[name].ConnectionString; } } public class DataAccess<T> { // 支持自定义连接字符串名称,默认使用ProxyRPDB public List<T> GetInfo(string query, object parameters = null, string connectionName = "ProxyRPDB") { using (IDbConnection connection = new SqlConnection(Helper.CnnVal(connectionName))) { // Dapper Query返回IEnumerable<T>,转List返回即可 return connection.Query<T>(query, parameters).AsList(); } } } }
注:确保你的项目已经通过NuGet安装了适配.NET 4.5.2的Dapper版本,且配置文件(App.config/Web.config)中已经添加了名为ProxyRPDB的连接字符串节点。
二、跨业务文件调用方式
调用时只需要为不同业务表定义对应的实体类,再指定泛型参数即可实现不同表查询、返回对应类型数据的需求,示例如下:
1. 定义业务实体类(示例:用户表对应实体)
// 你的业务项目中定义的实体类 public class UserInfo { public int Id { get; set; } public string UserName { get; set; } public int Age { get; set; } }
2. 调用封装方法执行查询
using DBConnector; // 先引用封装的命名空间 public class UserBusinessService { public List<UserInfo> GetAllAdultUsers() { // 1. 实例化DataAccess时指定泛型为当前业务对应的实体类型 var db = new DataAccess<UserInfo>(); // 2. 传入对应表的查询语句、查询参数即可 string sql = "SELECT Id, UserName, Age FROM UserInfo WHERE Age >= @Age"; var parameters = new { Age = 18 }; // 3. 直接拿到对应实体类型的返回结果 return db.GetInfo(sql, parameters); } }
三、可选优化方案
你可以将泛型定义从类移到方法上,避免每个实体类型都要实例化新的DataAccess对象,使用更便捷:
// 优化后的非泛型DataAccess类 public class DataAccess { public List<T> GetInfo<T>(string query, object parameters = null, string connectionName = "ProxyRPDB") { using (IDbConnection connection = new SqlConnection(Helper.CnnVal(connectionName))) { return connection.Query<T>(query, parameters).AsList(); } } } // 调用方式更简化 var db = new DataAccess(); var userList = db.GetInfo<UserInfo>(sql, parameters); var orderList = db.GetInfo<OrderInfo>(orderSql, orderParameters);
内容的提问来源于stack exchange,提问作者TrashaPanda
相关产品推荐
相关产品推荐

