全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Dapper怎么处理多对多关系 Dapper many-to-many查询映射

Dapper通过手动JOIN中间表+MultiMapping+字典缓存实现多对多映射,核心是SQL扁平查询、splitOn分割字段、内存重组对象树;需注意LEFT JOIN处理空关联、字段别名防冲突、集合初始化及大数据量性能优化。

Dapper 本身不自动处理多对多关系,但通过手动编写连接查询 + MultiMapping 配合字典缓存,就能干净地映射出带集合的嵌套对象,比如“商品拥有多个分类”或“文章属于多个标签”。

核心思路:用中间表 JOIN + splitOn 分割 + 字典去重组装

多对多在数据库中一定有中间表(如 ProductCategory、PostTag)。Dapper 要做的不是“自动识别关系”,而是把 JOIN 后的扁平结果,按逻辑重新组织成对象树。

  • SQL 必须 SELECT 主表字段 + 中间表字段 + 关联表字段(注意别名防冲突)
  • Query 多参数泛型方法,指定主实体、关联实体和返回类型
  • splitOn 值必须设为关联表的第一个字段名(如 CategoryId),告诉 Dapper 从哪一列开始映射第二个类
  • Dictionary 缓存已创建的主对象,避免同一主记录因多条关联行被重复实例化

典型代码示例:Product ←→ Category

假设三张表:Products(Id, Name)Categories(Id, Name)ProductCategories(ProductId, CategoryId)

var sql = @"
  SELECT p.Id, p.Name,
         c.Id AS CategoryId, c.Name AS CategoryName
  FROM Products p
  INNER JOIN ProductCategories pc ON p.Id = pc.ProductId
  INNER JOIN Categories c ON pc.CategoryId = c.Id";

var products = new Dictionary();
connection.Query(sql,
  (product, category) =>
  {
    if (!products.TryGetValue(product.Id, out var p))
    {
      p = product;
      p.Categories = new List(); // 初始化集合
      products.Add(p.Id, p);
    }
    p.Categories.Add(category);
    return p;
  },
  splitOn: "CategoryId"
);

return products.Values.ToList();

注意:这里 splitOn: "CategoryId" 是关键——因为 SQL 中 c.Id AS CategoryId 是关联表字段的起始列,Dapper 才知道前面是 Product,后面是 Category。

注意事项和避坑点

  • 如果某商品没有分类,INNER JOIN 会丢掉该商品;改用 LEFT JOIN 可保留,但需判断 category.Id == null 再决定是否添加
  • 字段名冲突必须用 AS 别名(如 p.Id AS ProductId, c.Id AS CategoryId),否则 splitOn 无法准确定位
  • 主实体的集合属性(如 Categories)必须在首次创建时初始化,否则 Add() 会报空引用
  • 不推荐一次性查超大结果集(比如 1000 个商品 × 平均 5 个分类 = 5000 行),性能瓶颈在内存组装;数据量大时考虑分页或两次查询(先查主表,再用 IN 查关联)

基本上就这些。多对多没那么神秘,本质还是“一次查平、内存聚拢”。只要 SQL 写对、splitOn 指对、字典用对,结构就稳了。


# go  # 大数据  # app  # 性能瓶颈  # sql  # NULL  # select  # int  # 泛型  # 对象  # 数据库  # 性能优化  # 多个  # 会报  # 字段名  # 第一个  # 就能  # 首次  # 设为  # 两次  # 才知道  # 自动识别 


相关文章: 北京网站制作网页,网站升级改版需要多久?  香港服务器租用每月最低只需15元?  Java解压缩zip - 解压缩多个文件或文件夹实例  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  广平建站公司哪家专业可靠?如何选择?  建站之星如何实现五合一智能建站与营销推广?  电商网站制作公司有哪些,1688网是什么意思?  建站之星伪静态规则如何设置?  XML的“混合内容”是什么 怎么用DTD或XSD定义  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  北京专业网站制作设计师招聘,北京白云观官方网站?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  建站之星后台管理如何实现高效配置?  如何获取免费开源的自助建站系统源码?  如何在IIS7中新建站点?详细步骤解析  网站制作知乎推荐,想做自己的网站用什么工具比较好?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何快速搭建高效香港服务器网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  网站app免费制作软件,能免费看各大网站视频的手机app?  建站之星安装步骤有哪些常见问题?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  无锡营销型网站制作公司,无锡网选车牌流程?  如何在阿里云购买域名并搭建网站?  建站为何优先选择香港服务器?  制作网站外包平台,自动化接单网站有哪些?  电商平台网站制作流程,电商网站如何制作?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站之星logo尺寸如何设置最合适?  如何选购建站域名与空间?自助平台全解析  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  宝塔面板如何快速创建新站点?  做企业网站制作流程,企业网站制作基本流程有哪些?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  ,柠檬视频怎样兑换vip?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何快速生成ASP一键建站模板并优化安全性?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  成都网站制作报价公司,成都工业用气开户费用?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  网站制作公司排行榜,四大门户网站排名?  建站之星导航菜单设置与功能模块配置全攻略  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何在服务器上三步完成建站并提升流量? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。