2016-12-14 8 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内でループすることを試みましたが、これにより初期属性が削除され続けました。

上記のプロパティを無視するように2番目のマッピングを設定しようとしましたが、これを取得できず、プロパティを上書きしていました。

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

答えて

1

私はあなたの近くに、しかし、あなたの質問の状態を考える:UserDetailsMyRealClassを私はMyRealClass

のリストにこれをマップする必要が

...しかし、あなたが試みマッピングマップ。代わりにUserDetailsからMyRealClassへの地図が実際に必要なようです。

はとにかく、ここでこれを達成する一つの方法です。ここで

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呼び出しがmappedrecordをマッピングし、そして、それはすでに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 

            }); 
       }); 
関連する問題