Dapper如何处理一对一关系 Dapper一对一查询映射教程

发布时间 - 2025-12-25 00:00:00    点击率:
Dapper一对一映射需写对SQL、选准splitOn列、写好组装委托;SQL须用别名避免同名列冲突,splitOn填关联对象首列名(如"UserId"),委托中手动赋值并处理null。

用Dapper做一对一映射,核心就三点:写对SQL、选对splitOn列、写好组装委托。它不自动推断关系,但控制清晰、性能高,适合明确知道数据结构的场景。

SQL要包含两个表的字段,并注意列名不冲突

必须把主表和关联表的所有需要字段都查出来,推荐用表别名避免同名列覆盖(比如两个表都有Id):

示例SQL:

SELECT p.Id AS PostId, p.Content, u.Id AS UserId, u.Name AS UserName
FROM Posts p
LEFT JOIN Users u ON u.Id = p.OwnerId

这样能确保Dapper按列顺序准确切分数据段。如果不用别名,且两表都有Id,Dapper可能误判分割点。

splitOn参数指定关联对象的起始列

splitOn不是写外键名,而是写“第二个对象字段在结果集里第一次出现的列名”。上例中User对象从UserId列开始,所以设为"UserId"

  • 如果SQL里写的是u.Id且没别名,那splitOn"Id"(但容易和p.Id混淆)
  • 如果用了u.Id AS UserId,就填"UserId"——更安全、更明确
  • 大小写敏感,必须和SQL中AS后的名称完全一致

用委托函数把子对象挂到父对象属性上

Query方法返回的是主对象类型,嵌套对象靠你自己在委托里赋值:

var posts = connection.Query(sql,
(post, user) => {
post.Owner = user;
return post;
},
splitOn: "UserId"
);

关键细节:

  • postuser都是Dapper根据splitOn自动创建的实例
  • LEFT JOINuser可能是null,建议在赋值前判断:post.Owner = user ?? new User(); 或保留null并用空合并操作符访问:post.Owner?.Name
  • 返回类型写Post,表示最终列表是IEnumerable

实体类得有可写属性,且类型匹配

比如Post类里要有public User Owner { get; set; },不能是只读属性或私有字段。Dapper只映射public set属性,且不支持自动构造嵌套对象(不会调用new User())。

如果Owner属性类型和SQL中映射的User不一致(比如写成了object),运行时会抛异常,不是静默失败。

基本上就这些。不复杂但容易忽略别名和splitOn的对应关系。


# app  # sql  # Object  # NULL  # select  # 数据结构  # public  # 委托  # var  # 对象  # 的是  # 都有  # 写好  # 都是  # 切分  # 要有  # 设为  # 用了  # 第二个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教你用AI将一段旋律扩展成一首完整的曲子  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Python自动化办公教程_ExcelWordPDF批量处理案例  如何在建站宝盒中设置产品搜索功能?  浅谈javascript alert和confirm的美化  如何在阿里云虚拟服务器快速搭建网站?  Laravel如何配置任务调度?(Cron Job示例)  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何处理异常和错误?(Handler示例)  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel中的withCount方法怎么高效统计关联模型数量  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  JS实现鼠标移上去显示图片或微信二维码  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  javascript中对象的定义、使用以及对象和原型链操作小结  在线制作视频网站免费,都有哪些好的动漫网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  微信小程序 闭包写法详细介绍  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  微信小程序制作网站有哪些,微信小程序需要做网站吗?  phpredis提高消息队列的实时性方法(推荐)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  高端建站如何打造兼具美学与转化的品牌官网?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  高防服务器租用如何选择配置与防御等级?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Linux系统命令中tree命令详解  如何快速完成中国万网建站详细流程?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何用JavaScript实现文本编辑器_光标和选区怎么处理  网站制作软件有哪些,制图软件有哪些?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  *服务器网站为何频现安全漏洞?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何撰写建站申请书?关键要点有哪些?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  用yum安装MySQLdb模块的步骤方法  怎么用AI帮你为初创公司进行市场定位分析?  IOS倒计时设置UIButton标题title的抖动问题  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何用PHP快速搭建高效网站?分步指南  Laravel如何使用Livewire构建动态组件?(入门代码)  如何在企业微信快速生成手机电脑官网?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何获取PHP WAP自助建站系统源码?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程