前言
-
本文只是讲解Dapper中同步和异步方法中的多映射处理方式和对应的业务逻辑。
-
起初只是想实现从两个表中取出数据得到一个多对多关系。返回结果如下:
-
所以就去看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