You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.NET Core和AutoMapper获取带角色的Identity用户列表

解决方案:使用.NET Core + AutoMapper获取带角色的Identity用户列表

需求说明

需要获取包含用户角色的Identity用户列表,每个用户仅拥有一个角色,通过AutoMapper完成实体到Dto的映射,最终返回如下格式的数据:

显示名称用户名邮箱地址角色部门名称
AdminAdmin123admin123@gmail.comAdminSystem 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:50:14