簡體   English   中英

AutoMapper從DTO中的列表到單個對象

[英]AutoMapper from list in DTO to individual object

我有下面的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());

我認為你很接近,但你的問題是:

我需要將其映射到MyRealClass列表中

...並且您嘗試映射將MyRealClass映射到UserDetails 看起來你真的想要從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調用將record mappedmapped ,它不應該覆蓋已經從ShinyDTO映射到ShinyDTO的映射的MyRealClass

您也可以在ConstructUsing調用中獲得所有這些,但這對我來說似乎更清晰。

您可以在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

                                     });
                 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM