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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11