新闻中心
Dapper如何映射多个对象 Dapper多表查询映射指南
Dapper通过Multi-Mapping、QueryMultiple和字典缓存三种方式处理多表关联:一对一用Query配合splitOn和委托组装;一对多用字典去重聚合;多独立结果集用QueryMultiple一次性查询。

Dapper 本身不自动处理多表关联的嵌套对象,但通过 Multi-Mapping(多映射) 和 QueryMultiple 两种核心方式,可以干净、高效地把一个或多个结果集映射到多个 .NET 对象。关键不是“能不能”,而是选对方法——取决于你查的是一对多、一对一,还是完全无关的多结果集。
用 Query 做一对一或多对一映射
这是最常用的方式,适合主从结构清晰、且从表最多一条记录的场景(比如 Post + User、Order + Customer)。Dapper 把一行结
果按指定列“切开”,前半段给第一个类型,后半段给第二个类型,再由你写委托组装。
- SQL 中字段顺序必须和泛型参数顺序一致:先 T1 字段,再 T2 字段;别名建议显式写出,避免同名列冲突
- splitOn 参数必须准确指向第二个对象的主键列名(如 "UserId" 或 "CustomerId"),不能只写 "Id" —— 如果两张表都叫 Id,不加别名就容易错位
- 委托里要主动赋值,比如
(post, user) => { post.Owner = user; return post; },Dapper 不会自动设属性 - 关联数据可能为 NULL(如 LEFT JOIN),记得在访问前判空:
post.Owner?.Name
用字典缓存处理一对多(如文章+评论)
单行 SQL 返回多条子记录时(比如 1 篇文章带 5 条评论),Query 会生成 5 个重复的 Post 实例。正确做法是手动去重+聚合:
达芬奇
达芬奇——你的AI创作大师
166
查看详情
- 定义
Dictionary<int post> lookup = new()</int>缓存已创建的 Post - 在映射委托中,先查字典:有则复用,无则新建并加入字典,再把当前 Comment 加入其 Comments 集合
- SQL 仍用 JOIN,但最终返回的是
IEnumerable<post></post>,每个 Post 的 Comments 已填充好 - 注意:子对象主键列(如 CommentId)也要在 splitOn 中明确,否则 Dapper 不知道从哪开始读 Comment
用 QueryMultiple 一次查多个独立结果集
当你要查的数据彼此无关(比如同时加载用户列表 + 订单统计 + 配置项),或一对多关系太复杂不适合单 SQL JOIN 时,QueryMultiple 更稳:
- SQL 写成用分号隔开的多语句:
"SELECT * FROM Users; SELECT COUNT(*) FROM Orders; SELECT * FROM Configs" - 调用
var multi = connection.QueryMultiple(sql),然后依次multi.Read<user>()</user>、multi.ReadSingle<int>()</int>、multi.Read<config>()</config> - 数据库只走一次往返,性能比多次 Query 好,也避免了 JOIN 导致的数据膨胀
- 适合报表页、后台首页等需要聚合多种数据的场景
基本上就这些。没有银弹,一对一用 Multi-Mapping,一对多靠字典缓存,多结果集用 QueryMultiple——选对路子,映射就不卡壳。
以上就是Dapper如何映射多个对象 Dapper多表查询映射指南的详细内容,更多请关注其它相关文章!
# .net
# 南海网站建设
# 这是
# 主键
# 正确处理
# 如何处理
# 图像处理
# 如何使用
# 第二个
# 的是
# 多个
# 达芬奇
# igs
# app
# 宜兴网站优化推荐公司
# 魔站网站建设
# 潍坊抖音seo怎么推广
# 建阳区seo推广
# 快速的微信关键词排名
# 营销小程序推广预算
# 做seo的具体步骤
# seo素质
# 营销笔记怎么推广
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
Fabric模组开发:自定义物品与物品组的现代管理方法
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
知音漫客正版漫画平台_知音漫客官网账号登录
Go语言中高效处理x-www-form-urlencoded表单数据
汽车之家官方网站官网入口_汽车之家网页版直接进入
解决J*aScript中重复选择项的确认对话框显示问题
VS Code远程开发时如何处理文件权限问题
Pyrogram与g4f集成:异步编程实践与常见错误解决
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
mc.js免安装版 mc.js一键畅玩入口
解决Bootstrap卡片顶部边距导致背景图下移的问题
机器学习中对数变换预测结果的反向还原
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
J*aScript Promise链中如何正确终止后续.then执行并处理错误
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
58动漫网在线官方网 58动漫网正版动漫入口网址
2026年CSGO开箱网站推荐 CSGO开箱平台精选
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
Django表单提交验证失败后保持字段值不刷新
最新韩小圈网页版登录入口_官网在线观看官方链接
狙击外星人小游戏开始_狙击外星人小游戏立即开始
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
Angular中父组件异步更新子组件复选框状态的实践指南
基于动态规划的房屋花卉种植最小成本算法详解
12306几点到几点不能订票? | 官方最新系统维护时间全解析
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
Excel Power Pivot如何处理XML数据源 构建高级数据模型
谷歌google账号注册详细步骤 谷歌账号注册官方教程
在Typer应用中优雅地处理和重组任意命令行参数
优化Django表单:提交验证失败后保留用户输入
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
必由学官网快捷入口 必由学网页版在线学习平台
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
yandex入口引擎手机版 yandex安卓版下载入口
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧


2025-12-16
浏览次数:次
返回列表