2016-12-14 23 views
3

我在下面的DTO中需要將它映射到一個平面視圖模型,這個想法是通過請求發出的一些屬性是共享的,但可能存在通過名單的名單。AutoMapper從DTO中的列表到單個對象

public class ShinyDTO 
{ 
    public List<UserDetails> Users { get; set; } 

    public string SharedPropertyOne { get; set; } 
    public string SharedPropertyTwo { get; set; } 
} 

public class UserDetails 
{ 
    public string Title { get; set; } 
    public string Forename { get; set; } 
    public string Surname { get; set; } 
} 

public class MyRealClass 
{ 
    public string SharedPropertyOne {get;set;} 
    public string SharedPropertyTwo {get;set;} 
    public string Title {get;set;} 
    public string Forename {get;set;} 
    public string Surname {get;set;} 
} 

//This will map all the shared properties 
MyRealClass request = Mapper.Map<MyRealClass>(dto); 

foreach (var record in dto.Users){ 
    //This bit overwrites the properties set above and then I only have the properties set for Forename, Surname, etc... 

    request = Mapper.Map<MyRealClass>(record); 
} 

我需要將其映射到MyRealClass的列表中。我試圖創建單獨的映射,然後在foreach中循環它,但這不斷刪除最初的屬性。

我也嘗試設置第二個映射忽略上面的屬性集,我無法得到這個工作,它仍然覆蓋屬性。

var autoMapperConfiguration = new MapperConfigurationExpression(); 
autoMapperConfiguration 
      .CreateMap<MyRealClass, UserDetails>() 
      .ForMember(c => c.SharedPropertyOne, d => d.Ignore()) 
      .ForMember(c => c.SharedPropertyTwo, d => d.Ignore()); 

回答

1

我覺得你接近,但你的問題指出:

我需要把這個映射到的MyRealClass

列表...但你試圖映射將MyRealClassUserDetails 。看起來你實際上想要一張從UserDetailsMyRealClass的地圖。

總之,這裏的一種實現方式:

var autoMapperConfiguration = new MapperConfigurationExpression(); 

autoMapperConfiguration.CreateMap<UserDetails, MyRealClass>(); 
autoMapperConfiguration.CreateMap<ShinyDTO, MyRealClass>(); 

var results = new List<MyRealClass>(); 

foreach(var record in dto.Users) { 
    var mapped = Mapper.Map<MyRealClass>(dto); 
    Mapper.Map(record, mapped); 

    results.Add(mapped); 
} 

這裏,第二Mapper.Map調用映射recordmapped,它不應該覆蓋已經被映射在由映射從ShinyDTO的價值觀MyRealClass

您也可以看中並在ConstructUsing調用中完成所有這一切,但這對我來說似乎更清楚。

+0

這就是我所需要的 - 你對映射是正確的,這只是我手動鍵入的東西 - 沒有複製和粘貼。 我試圖做mapped = Mapper.Map(record,mapped);重新分配它。 – Kieran

0

您可以在UserDetailsIEnumerable<MyRealClass>之間創建地圖。

var autoMapperConfiguration = new MapperConfigurationExpression(); 
autoMapperConfiguration 
      .CreateMap<IEnumerable<MyRealClass>, UserDetails>() 
      .ForMember(dest => dest.SharedPropertyOne, opt => opt.MapFrom(x => x.get(0).SharedPropertyOne)); //you can check if the list is empty 
      .ForMember(dest => dest.SharedPropertyTwo, opt => opt.MapFrom(x => x.get(0).SharedPropertyTwo)); //you can check if the list is empty 
      .AfterMap((src,dest) => //src is a list type 
       { 
         foreach(MyRealClass myrealclass in src) 
          dest.Users.add(new UserDetails(){ 
              Title = myrealclass.Title, 
              Forename = myrealclass.Forename, 
              Surname = myrealclass.Surname 

            }); 
       }); 
相關問題