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

Dapper多映射场景疑问:关联表指定字段查询实现咨询

Dapper多映射是否适用于你的场景?

嘿,这个问题其实得分情况来看,但结论是:你既可以用多映射,也有更轻量的选择,具体取决于你的需求:

情况1:只需要turbine_name和m_energy_prod这两个字段

如果你的目标仅仅是获取这两个字段的组合数据,不需要操作原有的Test和TestMaster类实例,那完全没必要用多映射——直接用自定义DTO(数据传输对象)或者匿名类型会更简单高效。

示例:用DTO接收结果

先定义一个只包含你需要字段的DTO:

public class TurbineEnergyInfo
{
    public string TurbineName { get; set; }
    public double EnergyProduction { get; set; }
}

然后编写查询,让Dapper直接映射到这个DTO:

using var connection = new SqlConnection("你的连接字符串");

var turbineEnergyList = connection.Query<TurbineEnergyInfo>(
    @"SELECT 
        t.turbine_name AS TurbineName,
        tm.m_energy_prod AS EnergyProduction
      FROM Test t
      INNER JOIN TestMaster tm 
        ON t.m_turbine_id = tm.m_turbine_id");

这种方式代码简洁,性能也更好,因为只处理你需要的字段。

情况2:需要保留Test和TestMaster的完整实例

如果后续业务逻辑中还需要用到这两个类的其他属性(比如Test的m_turbine_id或者TestMaster的m_date),那Dapper多映射就是正确的选择,它能帮你把关联的查询结果分别映射到对应的类实例中。

示例:多映射关联两个类

using var connection = new SqlConnection("你的连接字符串");

var combinedResults = connection.Query<Test, TestMaster, (Test, TestMaster)>(
    @"SELECT 
        t.turbine_name, t.m_turbine_id,
        tm.m_energy_prod, tm.m_turbine_id, tm.m_date
      FROM Test t
      INNER JOIN TestMaster tm 
        ON t.m_turbine_id = tm.m_turbine_id",
    // 映射逻辑:把拆分后的结果分别赋值给Test和TestMaster实例
    (test, testMaster) => (test, testMaster),
    // 指定拆分点:Dapper会在第一个出现`m_turbine_id`的位置拆分结果集
    splitOn: "m_turbine_id"
);

// 提取你需要的字段
foreach (var (test, testMaster) in combinedResults)
{
    Console.WriteLine($"涡轮机名称:{test.turbine_name},发电量:{testMaster.m_energy_prod}");
}

这里要注意splitOn参数的作用:它告诉Dapper在哪里拆分查询结果,将前半部分映射到Test,后半部分映射到TestMaster。

总结

  • 若仅需目标字段:优先用DTO/匿名类型,更轻量高效;
  • 若需保留原类实例:使用Dapper多映射,完美适配关联表的对象映射需求。

内容的提问来源于stack exchange,提问作者papagallo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:39:51