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

C#中如何将匿名类型转换为自定义实体类DetailRoleDto?

解决方案:匿名类型转DetailRoleDto

有三种可行的方法,按推荐优先级排序:

1. 直接在LINQ查询中构造实体类(最优解)

修改你的GetById方法,直接在Select中构建DetailRoleDto和PermissionRole实体,避免后续转换步骤,性能更优:

public async Task<DetailRoleDto> GetById(int id)
{
    var rolePermissions = await _permissionRepository.GetAllNonTracking()
        .Where(x => x.RoleId == id)
        .Select(x => new
        {
            Id = x.RoleId,
            Name = x.Role.Name,
            Description = x.Role.Description,
            PermissionId = Enum.GetName((PermissionType)x.PermissionId),
            ModuleId = Enum.GetName((CAModules)x.ModuleId),
        })
        .ToListAsync();

    var rolePermissionFormatted = rolePermissions.GroupBy(x => new { x.Id, x.Name, x.Description })
        .Select(gcs => new DetailRoleDto
        {
            Id = gcs.Key.Id,
            Name = gcs.Key.Name,
            Description = gcs.Key.Description,
            PermissionRoles = gcs.Select(p => new { p.ModuleId, p.PermissionId })
                .GroupBy(x => x.ModuleId)
                .Select(per => new PermissionRole
                {
                    ModuleName = per.Key,
                    Permission = per.Select(x => x.PermissionId).ToList()
                })
                .ToList()
        })
        .FirstOrDefault();

    return rolePermissionFormatted;
}

关键修改点:

  • 方法返回类型从object改为DetailRoleDto,直接返回目标实体
  • 替换所有匿名类型构造为对应的实体类构造
  • 对Permission调用ToList(),匹配实体中List<string>的类型要求

2. 手动映射匿名对象

如果已经持有匿名类型的rolePermissionFormatted,可以手动逐个属性赋值转换:

// 假设rolePermissionFormatted是已生成的匿名对象
var detailRoleDto = new DetailRoleDto
{
    Id = rolePermissionFormatted.Id,
    Name = rolePermissionFormatted.Name,
    Description = rolePermissionFormatted.Description,
    PermissionRoles = rolePermissionFormatted.PermissionRoles
        .Select(pr => new PermissionRole
        {
            ModuleName = pr.ModuleName,
            Permission = pr.Permission.ToList()
        })
        .ToList()
};

3. 使用AutoMapper自动映射

通过AutoMapper框架实现自动化映射,适合频繁转换的场景:

步骤1:安装AutoMapper包

Install-Package AutoMapper

步骤2:配置映射并转换

// 配置映射规则(建议放在单独的Profile类中)
var mapperConfig = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<object, DetailRoleDto>(); // 匿名类型与实体属性名匹配时可自动映射
    cfg.CreateMap<object, PermissionRole>();
});

IMapper mapper = mapperConfig.CreateMapper();
DetailRoleDto detailRoleDto = mapper.Map<DetailRoleDto>(rolePermissionFormatted);

说明:

AutoMapper会自动匹配同名属性,包括集合类型的转换,无需额外配置属性映射规则。


内容的提问来源于stack exchange,提问作者Thanh Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19