C# Dapper MultiMapper 多映射相关知识

前言

  1. 本文只是讲解Dapper中同步和异步方法中的多映射处理方式和对应的业务逻辑。

  2. 起初只是想实现从两个表中取出数据得到一个多对多关系。返回结果如下:
    在这里插入图片描述

  3. 所以就去看Dapper的官方文档是否有一个方法可以实现的,其中发现了同步和异步中都有关于多映射的方法。

  • 但其实还是要根据实际业务逻辑判断,并没有完美适配。

正文

方法1:连接表SQL–>父子级实体类映射–>父级实体类集合

方法签名

public static IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>
(	this IDbConnection cnn, 
	string sql, //sql语句
	Func<TFirst, TSecond, TReturn> map,  //两类型实例父子map方式
	string splitOn = "Id",  //字段分割定义
	IDbTransaction transaction = null,
	......);
public static Task<IEnumerable<TReturn>> QueryAsync<TFirst, TSecond, TThird, TReturn>(......)
  • 1)编写连接表查询的SQL语句,注意其中字段的顺序,会跟你代码中实体类的顺序相关。

在这里插入图片描述

  • 2)通过Dapper对查询结果进行映射,分出等级关系并赋值,得到每个映射好的父实体类集合
    - sql语句查询结果
    在这里插入图片描述

  • 3)通过业务层对其再封装,最终得到了多对多的集合。
    - 个人示例代码

//仓储层
string sql = @"SELECT
					r.id AS RId,
					r.RoleId AS RoleId,
					r.RoleName,
					p.id AS PId,
					p.PersonUserName AS PersonUserName 
				FROM
					tb_custrole AS r
					INNER JOIN tb_custpermision AS p ON r.id = p.CustRoleId 
					AND p.Deleted = 0
				WHERE
					r.IsCustomer = 0 
					AND r.CustStoreId = 'CS0000066325' 
					AND r.CustConfigId = 'TR9999891757' 
					AND r.Deleted = 0;";

return await db.QueryAsync<RoleWithPersonPO, PersonPO, RoleWithPersonPO>(sql,
        (roleWithPerson, person) =>
        {
   
            roleWithPerson.Persons = person;
            return roleWithPerson;
        },
        new {
    custId = customerId, custConfigId = customerConfigId },
        splitOn: "PId");

//业务层
using (var scope = _databaseScopeFactory.CreateReadOnly())
        {
   
            var result = await _roleWithPersonRepository.GetMultiMapper2(request.CustId, request.CustConfigId, request.IsCustomer
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值