C#与.NET Core中Dapper对象映射及splitOn参数疑问解答
Dapper相关疑问解答
1. Query方法泛型参数中Parts出现两次的原因及该方法的作用
这是Dapper多映射查询的重载写法,比如你看到的大概率是connection.Query<Parts, Supplier, Parts>(...)这类形式。
- 出现两次的原因:泛型参数的最后一个是最终返回结果的类型,前面的参数是Dapper需要从查询结果中拆分映射的对象类型。如果最后一个参数和第一个都是Parts,说明你要把查询结果拆分映射到Parts和其他关联对象(比如Supplier、Product)后,最终返回组装好的Parts对象集合。
- 方法作用:专门处理多表关联查询的结果映射,把单一行(或多行)包含多表数据的查询结果,拆分映射成多个独立对象实例,再通过后续逻辑组装成带关联属性的完整业务对象(这里就是Parts),最后返回该业务对象的集合。
2. map委托是否用于将查询结果关联到Parts对象的Supplier和Product属性
完全正确,map委托就是干这个的。
Dapper会先根据泛型参数和splitOn规则,把查询结果拆分成多个独立对象(比如Parts主对象、Supplier对象、Product对象),map委托就是让你编写逻辑,把拆分出来的Supplier、Product实例,赋值给Parts对象对应的Supplier和Product属性,完成整个对象的组装。比如常见的写法类似:
(part, supplier, product) => { part.Supplier = supplier; part.Product = product; return part; }
3. splitOn参数的工作机制
splitOn的核心作用是告诉Dapper在哪里拆分查询结果的列,对应到不同的泛型对象,具体机制如下:
- 默认规则:Dapper默认以名为
Id的列作为拆分点。比如查两个表的关联结果,结果集里有Id列,它会把Id之前的列映射给第一个泛型对象,Id及之后的列映射给第二个泛型对象。 - 自定义拆分:当关联对象的主键不是
Id,或者需要拆分到3个及以上对象时,就需要用splitOn指定拆分列名,比如splitOn: "SupplierId,ProductId"。Dapper会按指定的列顺序拆分结果集:从开头到SupplierId之前的列映射给第一个对象(Parts),SupplierId到ProductId之前的列映射给第二个对象(Supplier),ProductId及之后的列映射给第三个对象(Product)。 - 注意:指定的拆分列必须是查询结果集中实际存在的列,且顺序要和泛型参数的对象顺序对应。
内容的提问来源于stack exchange,提问作者cdub
相关产品推荐
相关产品推荐

