2016-02-04 26 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