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
相关产品推荐
相关产品推荐

