2016-10-01 130 views
3

我在中遇到了一個問題,即將一個帶有嵌套列表的源對象映射到多個目標對象。至於項目限制,我只能調整部分代碼。我正在使用AutoMapper 5.1。AutoMapper - 一對多映射

/// no changes possible 
namespace Source 
{ 
    class Person 
    { 
     public string Name { get; set; } 
     public List<Car> Cars { get; set; } 

     public Person() 
     { 
      Cars = new List<Car>(); 
     } 
    } 

    class Car 
    { 
     public string NumberPlate { get; set; } 
    } 
} 

/// no changes possible 
namespace Destination 
{ 
    class PersonCar 
    { 
     public string Name { get; set; } 
     public string NumberPlate { get; set; } 
    } 
} 

/// Demo Consolen Application 
static void Main(string[] args) 
{ 
    #region init data 
    Person person = new Person(); 
    for (int i = 0; i < 10; i++) 
    { 
     person.Cars.Add(new Source.Car() { NumberPlate = "W-100" + i }); 
    } 
    #endregion 

    /// goal is to map from one person object o a list of PersonCars    
    Mapper.Initialize(
     cfg => cfg.CreateMap<Person, List<PersonCar>>() 
      /// this part does not work - and currently I am stuck here 
      .ForMember(p => 
      { 
       List<PersonCar> personCars = new List<PersonCar>(); 

       foreach (Car car in p.Cars) 
       { 
        PersonCar personCar = new PersonCar(); 
        personCar.Name = p.Name; 
        personCar.NumberPlate = car.NumberPlate; 
        personCars.Add(personCar); 
       } 
       return personCars; 
      }) 
    ); 

    // no changes possible 
    List<PersonCar> result = Mapper.Map<Person, List<PersonCar>>(person); 
} 

}

現在,我被困在確定這一問題的適當映射。雖然我在workt做了(醜陋!!)映射(左代碼在那裏.. facepalm)我確信必須有一個簡單的解決方案來解決這個問題。

任何幫助,將不勝感激!

回答

3

您可以使用.ConstructProjectionUsing方法,以提供您想要的實體的投影。

Mapper.Initialize(cfg => { 
    cfg.CreateMap<Person, List<PersonCar>>() 
     .ConstructProjectionUsing(
      p => 
       p.Cars.Select(c => new PersonCar { Name = p.Name, NumberPlate = c.NumberPlate }) 
       .ToList() 
     ); 
}); 
+0

非常感謝! –

+0

這基本上只是做常規的映射。 – Proximo