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

月夜之吻
发布: 2025-12-17 10:21:57
原创
303人浏览过
Dapper通过手动JOIN中间表+MultiMapping+字典缓存实现多对多映射,核心是SQL扁平查询、splitOn分割字段、内存重组对象树;需注意LEFT JOIN处理空关联、字段别名防冲突、集合初始化及大数据量性能优化。

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

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

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

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

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

典型代码示例:Product ←→ Category

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

Text-To-Pokemon口袋妖怪
Text-To-Pokemon口袋妖怪

输入文本生成自己的Pokemon,还有各种选项来定制自己的口袋妖怪

Text-To-Pokemon口袋妖怪 1487
查看详情 Text-To-Pokemon口袋妖怪
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<int, Product>();
connection.Query<Product, Category, Product>(sql,
  (product, category) =>
  {
    if (!products.TryGetValue(product.Id, out var p))
    {
      p = product;
      p.Categories = new List<Category>(); // 初始化集合
      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 指对、字典用对,结构就稳了。

以上就是Dapper怎么处理多对多关系 Dapper many-to-many查询映射的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号