如何使用.NET Core和AutoMapper获取带角色的Identity用户列表
解决方案:使用.NET Core + AutoMapper获取带角色的Identity用户列表
需求说明
需要获取包含用户角色的Identity用户列表,每个用户仅拥有一个角色,通过AutoMapper完成实体到Dto的映射,最终返回如下格式的数据:
| 显示名称 | 用户名 | 邮箱地址 | 角色 | 部门名称 |
|---|---|---|---|---|
| Admin | Admin123 | admin123@gmail.com | Admin | System Defined |
当前代码情况
查询处理代码
public async Task<Result<PagedList<AppUserDto>>> Handle(Query request, CancellationToken cancellationToken) { var query = _context.Users .OrderByDescending(d => d.Id).ProjectTo<AppUserDto>(_mapper.ConfigurationProvider) .AsQueryable(); return Result<PagedList<AppUserDto>>.Success( await PagedList<AppUserDto>.CreateAsync(query, request.Params.PageNumber, request.Params.PageSize) ); }
AppUserDto 定义
public class AppUserDto { public string Id { get; set; } public string DisplayName { get; set; } public string UserName { get; set; } public string Email { get; set; } public string DepartmentNameE { get; set; } public string RoleId { get; set; } public string RoleName { get; set; } }
AutoMapper 映射配置
CreateMap<AppUser, AppUserDto>() .ForMember(d => d.DepartmentNameE, o => o.MapFrom(s => s.FDSDepartments.DepartmentNameE));
AppUser 实体定义
public class AppUser : IdentityUser { public string DisplayName { get; set; } public int DepartmentID { get; set; } public virtual FDSDepartments FDSDepartments { get; set; } }
实现步骤
1. 补充AppUser的角色关联导航属性
Identity框架中用户与角色默认是多对多关联,需在AppUser中添加角色关联的导航属性:
public class AppUser : IdentityUser { public string DisplayName { get; set; } public int DepartmentID { get; set; } public virtual FDSDepartments FDSDepartments { get; set; } // 添加用户角色关联导航集合 public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>(); }
2. 修改查询代码,关联角色数据
查询时需要Include用户的角色关联表及角色表,确保能获取到角色信息:
public async Task<Result<PagedList<AppUserDto>>> Handle(Query request, CancellationToken cancellationToken) { var query = _context.Users .Include(u => u.FDSDepartments) // 关联用户角色表和角色表 .Include(u => u.Roles) .ThenInclude(ur => ur.Role) .OrderByDescending(d => d.Id) .ProjectTo<AppUserDto>(_mapper.ConfigurationProvider) .AsQueryable(); return Result<PagedList<AppUserDto>>.Success( await PagedList<AppUserDto>.CreateAsync(query, request.Params.PageNumber, request.Params.PageSize) ); }
3. 更新AutoMapper映射配置
针对每个用户仅一个角色的场景,直接映射第一个角色的ID和名称:
CreateMap<AppUser, AppUserDto>() .ForMember(d => d.DepartmentNameE, o => o.MapFrom(s => s.FDSDepartments.DepartmentNameE)) // 映射角色ID .ForMember(d => d.RoleId, o => o.MapFrom(s => s.Roles.FirstOrDefault()!.RoleId)) // 映射角色名称 .ForMember(d => d.RoleName, o => o.MapFrom(s => s.Roles.FirstOrDefault()!.Role.Name));
可选空值处理
若存在无角色用户,可添加空值判断避免报错:
.ForMember(d => d.RoleName, o => o.MapFrom(s => s.Roles.FirstOrDefault()?.Role.Name ?? "无角色"))
内容的提问来源于stack exchange,提问作者Irfan Arif
相关产品推荐
相关产品推荐

