能否通过Dapper自动扩展类成员实现嵌套类查询映射?
Dapper实现嵌套对象自动映射
可以实现,不需要把两个类的字段平铺到Class_C中,Dapper支持通过多类型映射结合自定义委托的方式,将关联查询结果自动拆分并组合成包含嵌套对象的Class_C。
具体实现步骤
- 调整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
- 使用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
相关产品推荐
相关产品推荐

