使用Automapper从嵌套了多个级别的列表中映射/转换为父属性

时间:2018-07-11 13:15:26

标签: c# automapper

我正在尝试使用Automapper映射如下所示的数据模型:

User
 -> UserRoles // list<UserRole> - has a prop for User and Role
  -> Role 
   -> RolePermissions // list<RolePermission> - has a prop for Role and Permission
    -> Permission

使用简化的模型作为Web服务的DTO,如下所示:

UserDto
 -> Roles // List<RoleDto>
 -> Permissions // List<PermissionDto>

您可以看到,第一个模型是数据库中的关系模型-它具有一对多对多的关系,我想以用户为中心,并汇总所有角色之间的所有权限用户有权访问。

我设法从User-> UserRoles-> Roles中映射了Roles属性的UserDto,但是Permissions的聚合确实使我把头撞到桌子上(而且我不认为2 gud,所以我需要帮助)

这是我映射到角色的代码,它似乎起作用。

CreateMap<RoleDto, UserRole>()
    .ForMember(x => x.Role, y => y.MapFrom(z => z))
    .ReverseMap();

CreateMap<UserRole, RoleDto>()
    .ForMember(x => x.RoleId, y => y.MapFrom(z => z.Role.RoleId))
    .ForMember(x => x.Name, y => y.MapFrom(z => z.Role.Name))
    .ReverseMap();

CreateMap<User, UserDto>() 
    .ForMember(x => x.Roles, y => y.MapFrom(z => z.UserRoles))
    // NOT SURE HOW TO MAP THIS NEXT LINE --->
    //.ForMember(x => x.Permissions, y => y.MapFrom(z => z.UserRoles)) 
    .ReverseMap();

如何将用户注册的所有角色之间的所有(唯一)权限汇总到该用户下的单个属性中?

谢谢

1 个答案:

答案 0 :(得分:1)

考虑您的域结构为:

public class User {
    public List<UserRole> UserRoles { get; set; }
}

public class UserRole {
    public Role Role { get; set; }
}

public class Role {
    public List<RolePermission> RolePermissions { get; set; }
}

public class RolePermission {
    public Permission Permission { get; set; }
}

public class Permission {
    public string MyPermission { get; set; }
}

您可以进行下一个映射:

CreateMap<Permission, PermissionDto>
   // Do your mapping of permissions
   .ForMember(...)'

CreateMap<User, UserDto>() 
    .ForMember(x => x.Roles, y => y.MapFrom(z => z.UserRoles))
    .ForMember(x => x.Permissions, y => y.MapFrom(z => z.UserRoles.Select(e=>e.Role).SelectMany(e=>e.RolePermissions).Select(e=>e.Permission).Distinct(e=>e.MyPermission))) 
    .ReverseMap();