【问题标题】:Automapper map to tuple which first element is list second one is simple propertyAutomapper 映射到第一个元素是列表的元组,第二个是简单属性
【发布时间】:2021-06-04 14:17:23
【问题描述】:

我需要映射此结果,但出现错误: AutoMapper.AutoMapperConfigurationException: '成员的自定义配置仅支持类型上的顶级个人成员。'

public class ResponseModel
    {
        public int TotalPageCount { get; set; }
        public IEnumerable<ExternalAPIResponseModel> ExternalAPIResponse { get; set; } = new List<ExternalAPIResponseModel>();
    }


 public class ExternalAPIResponseModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string JobFunction { get; set; }
        public string JobLevel { get; set; }
        public string CompanyName { get; set; }
        public string State { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public string Address { get; set; }
    }


 public class Contact
    {
        public int Ocid { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        // etc.
    }

 
//I know the mistake is here
CreateMap<(IEnumerable<Contact> Contacts, int pagesCount), ResponseModel>()
               .ForMember(dest => dest.ExternalAPIResponse.Select( x=>new {
                       x.Address,
                       x.CompanyName,
                       x.FirstName,
                       x.LastName,
                       x.JobFunction,
                       x.JobLevel,
                       x.Email,
                       x.Phone,
                       x.State
                   }),
                   
                    opt => opt.MapFrom(src => src.Contacts.Select(c=> new { 
                    c.ContactAddress1,
                    c.HqcompanyName,
                    c.FirstName,
                    c.LastName,
                    c.IdjobFunctionNavigation.JobFunction1,
                    c.IdjobLevelNavigation.JobLevel1,
                    c.Email,
                    c.ContactPhone,
                    c.ContactState })))
                         
               .ForMember(dest => dest.TotalPageCount, opt => opt.MapFrom(src => src.pagesCount));
   
    //I call it from conntroller like this 
    var mappedResult = _mapper.Map<ResponseModel>(result);

如何将 (IEnumerable Contacts, int pagesCount) 映射到 ResponseModel 以免出错?

【问题讨论】:

  • 你确定要IEnumerable&lt;ResponseModel&gt;吗?我觉得你只需要ResponseModel,因为它有IEnumerable&lt;ExternalAPIResponseModel&gt;,它将从IEnumerable&lt;Contact&gt;映射
  • 是的,你说得对,有错误我会修复,我只需要 ResponseModel
  • result 的类型是什么?是Tuple 还是IEnumerable&lt;Contacts&gt; 或其他?

标签: c# .net .net-core automapper


【解决方案1】:

使用TupleTuple&lt;IEnumerable&lt;Contact&gt;, int&gt;,然后将其映射到ResponseModel

映射器

   CreateMap<Contact, ExternalAPIResponseModel>()
        .ForMember(dest => dest.FirstName, opt => opt.MapFrom(source => source.FirstName))
        .ForMember(dest => dest.LastName, opt => opt.MapFrom(source => source.LastName))
        .ForMember(dest => dest.CompanyName, opt => opt.MapFrom(source => source.HqcompanyName))
        .ForMember(dest => dest.Address, opt => opt.MapFrom(source => source.ContactAddress1))
        .ForMember(dest => dest.JobFunction, opt => opt.MapFrom(source => source.IdjobFunctionNavigation.JobFunction1))
        .ForMember(dest => dest.JobLevel, opt => opt.MapFrom(source => source.IdjobLevelNavigation.JobLevel1))
        .ForMember(dest => dest.Email, opt => opt.MapFrom(source => source.Email))
        .ForMember(dest => dest.Phone, opt => opt.MapFrom(source => source.ContactPhone))
        .ForMember(dest => dest.State, opt => opt.MapFrom(source => source.ContactState));

    CreateMap<Tuple<IEnumerable<Contact>, int>, ResponseModel>()
        .ForMember(dest => dest.ExternalAPIResponse, opt => opt.MapFrom(source => source.Item1))
        .ForMember(dest => dest.TotalPageCount, opt => opt.MapFrom(source => source.Item2));

在控制器中

int pagesCount = 10;
IEnumerable<Contact> contacts = GetListOfContacts(pagesCount);
Tuple<IEnumerable<Contact>, int> result = Tuple.Create(contacts, pagesCount);
var mappedResult = _mapper.Map<ResponseModel>(result);

【讨论】:

  • 这是手动映射,不需要AM!
  • @LucianBargaoanu “当我想摆脱无聊的左侧右侧代码时,我会使用 AutoMapper。如果复制数据的逻辑不完全明显,我会回到手动映射。” - 你自己的 Jimmy Bogard 的话stackoverflow.com/questions/28574187/…...
  • 是的,但这不是简单的手动映射,它是通过不当使用 AM 来混淆的,两全其美 :)
  • 在某些情况下,碰巧我们必须像这样使用 Automapper 来保持与设计的一致性...如果还有 99 种其他情况,我们可以利用 AutoMapper 功能和一种我们无法使用的情况没关系..
  • 类型转换器在这种情况下效果最好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多