You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用泛型实现通用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

火山引擎 最新活动