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
相关产品推荐
相关产品推荐

