如何使用泛型实现通用Dapper数据读取方法?
修正你的Dapper通用泛型读取方法
嘿,你的思路完全没问题——泛型就是实现这类通用数据访问方法的最佳方式!不过你写的代码里有几个小细节需要调整,我帮你梳理并修正一下:
先说说原代码里的问题:
- 没必要传
ref T returnType参数:泛型参数<T>已经明确了返回类型,调用时直接指定T就行,不需要额外传这个变量 cmd.Query<returnType>语法错误:泛型参数需要用类型名(也就是我们定义的T),而不是变量名returnType- 方法返回值定义不对:
Query<T>()返回的是可枚举集合,ToList()后是List<T>,而不是单个T,所以返回类型应该改成List<T>
修正后的完整代码:
using System.Data; using System.Data.SqlClient; using System.Configuration; using Dapper; public static class DapperHelper { public static List<T> ListReader<T>(string sql, string dbName = "TEST") { // 用更准确的变量名:connection而不是cmd,因为这是数据库连接对象 using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[dbName].ConnectionString)) { // 直接用泛型参数T指定查询的实体类型 return connection.Query<T>(sql).ToList(); } } }
怎么使用这个方法?
假设你有一个和数据库表对应的实体类:
public class Customer { public int CustomerId { get; set; } public string CustomerName { get; set; } public string Email { get; set; } }
调用方法时,只需要指定泛型类型Customer,传入SQL语句即可:
var customers = DapperHelper.ListReader<Customer>("SELECT CustomerId, CustomerName, Email FROM Customers");
额外优化:支持参数化查询
如果需要防止SQL注入,或者要传查询参数,可以给方法加一个可选的参数对象:
public static List<T> ListReader<T>(string sql, object parameters = null, string dbName = "TEST") { using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[dbName].ConnectionString)) { // 传入参数对象,Dapper会自动处理参数化 return connection.Query<T>(sql, parameters).ToList(); } }
调用示例:
var activeCustomers = DapperHelper.ListReader<Customer>( "SELECT CustomerId, CustomerName, Email FROM Customers WHERE IsActive = @IsActive", new { IsActive = true } // 匿名对象作为参数 );
小提示
- 确保实体类的属性名和数据库列名一致,如果不一致,可以用Dapper的
[Column]特性来映射,比如[Column("CustName")] public string CustomerName { get; set; } - 记得引用Dapper NuGet包,不然
Query<T>()方法不会存在哦
内容的提问来源于stack exchange,提问作者Kyle Eales




