2016-02-04 25 views
0

我有不同类型的源对象的两个集合。我希望将两个集合(两者的联合)映射到具有来自两个源类型的所有成员的类型的单个目标集合。如果我这样做:AutoMapper - 地图两种不同类型的源集合到单一目的地集合

CreateMap<Company, CompanyResponse>() 
       .ForMember(x => x.Owners, m => m.MapFrom(x => x.BusinessOwners)) 
       .ForMember(x => x.Owners, m => m.MapFrom(x => x.IndividualOwners)); 

它只映射最后一次映射。我尝试了更精细的映射,但这似乎打破了automapper所做的实体框架投影集成。我正在使用ProjectTo。

这是我试过这也确实传达我想要的结果的一个好工作。

CreateMap<Company, CompanyResponse>() 
     .ForMember(x => x.Owners, m => m.ResolveUsing(x => x.BusinessOwners.Select(o => new OwnerResponse 
     { 
      Type = UpdateRegistrationCommand.CompanyUpdate.OwnerType.Business, 
      Address = o.Address, 
      PercentageShareholding = o.Percentage, 
      BusinessName = o.Name, 
      BusinessNumber = o.Number 
     }) 
     .Union(x.IndividualOwners.Select(o => new OwnerResponse 
     { 
      Type = UpdateRegistrationCommand.CompanyUpdate.OwnerType.Individual, 
      Address = o.Address, 
      PercentageShareholding = o.Percentage, 
      Title = o.Title, 
      FirstName = o.FirstName, 
      MiddleNames = o.MiddleNames, 
      LastName = o.LastName 
     })))); 

有没有人做过这样的事情?

回答

1

根据AutoMapper's documentation,您可能需要尝试ProjectUsing<>()而不是ResolveUsing<>()

+0

嗨,Erik。 ProjectUsing似乎适用于整个地图与单个目标表达式。 我可以轻松定义从IndividualOwner到OwnerResponse以及BusinessOwner到OwnerResponse的地图。我不能做的是将这两幅地图的结果联合起来。我想我可能会为每个集合在同一类型的目标上定义两个属性。然后是第三个只读属性,它返回两者的组合。我通过json序列化器运行这些东西,这样我就可以排除原来的两个属性,并留下我想要的结果。 – Sam

+0

实际上,这种方法并不完善。我仍然不得不使用ProjectUsing来控制实体如何预测企业所有者和个体所有者及其工作。所以你的回答是一个帮助谢谢。 – Sam