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

能否通过Dapper自动扩展类成员实现嵌套类查询映射?

Dapper实现嵌套对象自动映射

可以实现,不需要把两个类的字段平铺到Class_C中,Dapper支持通过多类型映射结合自定义委托的方式,将关联查询结果自动拆分并组合成包含嵌套对象的Class_C。

具体实现步骤

  1. 调整SQL查询(可选但推荐):为避免字段名冲突(比如两个类都有Key字段),建议给查询字段添加别名,明确区分属于Class_A和Class_B的字段:
SELECT 
    a.Name, a.Age, a.Key AS CA_Key,
    b.Doors, b.Windows, b.Key AS CB_Key
FROM Class_A a
JOIN Class_B b ON a.Key = b.Key
  1. 使用Dapper的多类型Query重载:通过指定映射委托和splitOn参数,让Dapper自动拆分结果并组装Class_C:
var classCList = _connection.Query<Class_A, Class_B, Class_C>(
    "SELECT a.Name, a.Age, a.Key AS CA_Key, b.Doors, b.Windows, b.Key AS CB_Key FROM Class_A a JOIN Class_B b ON a.Key = b.Key",
    (classA, classB) => new Class_C { CA = classA, CB = classB },
    splitOn: "CB_Key"
);
  • splitOn参数指定从哪个字段开始切换到第二个类型(Class_B)的映射,这里用CB_Key作为拆分点,Dapper会将之前的字段映射到Class_A,之后的映射到Class_B。
  • 委托部分负责将映射好的Class_A和Class_B实例组合成Class_C对象。

注意事项

  • 如果SQL中字段顺序是Class_A的字段在前、Class_B的字段在后,且两个类的拆分字段明确,也可以直接用原始字段名(比如splitOn: "Key"),但别名能避免歧义,更推荐使用。
  • 确保Class_C的属性可赋值(如果是只读属性,需要有对应的构造函数,或者改用可写属性,Dapper默认需要可写属性或构造函数参数匹配)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:24:51