使用匿名类型时如何配置Automapper Profile实现映射
结论
完全可以通过AutoMapper的Profile配置实现匿名类型到ArtistaTipoDizionarioViewModel的直接映射,无需额外创建中间实体类。
具体配置步骤
1. 编写Profile配置文件
创建ArtistaTipoDizionarioViewModelProfile.cs文件,参考以下规则编写映射逻辑:
using AutoMapper; // 此处替换为你项目中对应实体、ViewModel的实际命名空间 using YourProject.EntityNamespace; using YourProject.ViewModelNamespace; public class ArtistaTipoDizionarioViewModelProfile : Profile { public ArtistaTipoDizionarioViewModelProfile() { // 源类型指定为object适配匿名类型,通过dynamic访问匿名类的属性 CreateMap<object, ArtistaTipoDizionarioViewModel>() // 示例:ViewModel的Id属性映射自tipo的Id字段,按需替换为你的实际属性名 .ForMember(dest => dest.Id, opt => opt.MapFrom(src => ((dynamic)src).tipo.Id)) // 示例:ViewModel的Nome属性映射自tipo的Nome字段 .ForMember(dest => dest.Nome, opt => opt.MapFrom(src => ((dynamic)src).tipo.Nome)) // 示例:ViewModel的Versione属性映射自storico的Versione字段 .ForMember(dest => dest.Versione, opt => opt.MapFrom(src => ((dynamic)src).storico.Versione)) // 其余属性按照上述规则逐一配置即可 ; } }
2. 简化原有业务代码
配置生效后,原有手动遍历映射的逻辑可以简化为批量映射,代码更简洁:
var query = from tipo in _artistaTipoRepository.GetAll() join storico in _artistaTipoStoricoRepository.GetAll() on tipo.Id equals storico.Id where storico.Versione == 0 select new { tipo, storico }; var entities = await query.ToListAsync(); // 直接批量映射,无需手动循环 var result = Mapper.Map<List<ArtistaTipoDizionarioViewModel>>(entities); return await Task.FromResult(result);
注意事项
- 映射配置中访问的匿名类属性名
tipo、storico必须和LINQ查询中定义的匿名类属性名完全一致,大小写严格匹配 - 需将该Profile注册到AutoMapper全局配置中,若你的项目已配置自动扫描程序集内的Profile,只需保证该类在扫描范围内即可生效
- 若需要类型安全的映射,可以自定义
IValueResolver实现,普通业务场景下使用dynamic的性能损耗可以忽略不计
内容的提问来源于stack exchange,提问作者advapi
相关产品推荐
相关产品推荐

