新闻中心

Dapper如何映射多个对象 Dapper多表查询映射指南

2025-12-16
浏览次数:
返回列表
Dapper通过Multi-Mapping、QueryMultiple和字典缓存三种方式处理多表关联:一对一用Query配合splitOn和委托组装;一对多用字典去重聚合;多独立结果集用QueryMultiple一次性查询。

dapper如何映射多个对象 dapper多表查询映射指南

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安卓版下载入口  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧 

搜索