AutoMapper从DTO中的列表到单个对象

时间:2016-12-14 14:00:27

标签: c# 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());

2 个答案:

答案 0 :(得分:1)

我认为你很接近,但你的问题是:

  

我需要将其映射到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映射到mapped,并且不应覆盖已从ShinyDTO到{的映射已映射的值{1}}。

你也可以在MyRealClass电话中看到所有这一切,但这对我来说似乎更清楚。

答案 1 :(得分: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

                                     });
                 });