You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:54:04