如何使用AutoMapper将Customer数据从List映射到Customer类

时间:2015-01-05 14:09:49

标签: c# automapper

我试图通过以下方式将客户数据从List映射到Customer类,但没有得到正确的结果。程序没有给出任何错误,但生成的客户数据为空值。

    using AutoMapper;

    List<Customer> oCust = new List<Customer>();
    oCust.Add(new Customer { Name = "Rajan", Salary = 200, CountryCode = "GB" });
    oCust.Add(new Customer { Name = "Ari", Salary = 200, CountryCode = "US" });
    oCust.Add(new Customer { Name = "Dib", Salary = 200, CountryCode = "CA" });

    var oCustomer = oCust.Where(x => x.CountryCode == "US").ToList(); ;

    Mapper.CreateMap<List<Customer>, Customer>();
    Customer viewModel = Mapper.Map<List<Customer>, Customer>(oCustomer);

我在Automapper from this url http://www.codearsenal.net/2012/12/csharp-object-to-object-mapping-automapper.html#.VKqYbckpp68

上阅读了一些文章

只需使用Automapper指导我如何解决上述问题。

1 个答案:

答案 0 :(得分:2)

就像我说here一样,你不需要AutoMapper。

此:

var oCustomer = oCust.Where(x => x.CountryCode == "US").ToList(); 

将填写客户列表。那么你想要一个客户:

Customer viewModel = Mapper.Map<List<Customer>, Customer>(oCustomer);

AutoMapper 可以这样做,但没有任何意义。当有多个客户应该选择哪个客户?

只需选择一个客户,然后返回:

Customer viewModel = oCustomer.FirstOrDefault();

如果您确实认为必须从列表映射到单个实体(再次,在这种情况下没有意义),请参阅Mapping from list down to object with AutoMapper

如果你真的,真的必须使用AutoMapper将列表中的单个项目映射到单个项目而你不想在列表中使用FirstOrDefault(),你可以这样做(拼凑在一起) Projection - AutoMapper WikiHow to use AutoMapper .ForMember?Automapper - Does it map lists of objects?):

Mapper.CreateMap<List<Customer>, Customer>()
      .ForMember(t => t.Name, 
                 opt => opt.MapFrom(s => s.FirstOrDefault().Name))
      .ForMember(t => t.Salary, 
                 opt => opt.MapFrom(s => s.FirstOrDefault().Salary))
      .ForMember(t => t.CountryCode, 
                 opt => opt.MapFrom(s => s.FirstOrDefault().CountryCode));

var oCustomer = oCust.Where(x => x.CountryCode == "US").ToList(); ;
Customer viewModel = Mapper.Map<List<Customer>, Customer>(oCustomer);         

请注意,这仍然使用.FirstOrDefault()。虽然我会警告你:当源列表为空,不易维护并导致其他问题时,此代码将抛出异常,其中一些问题可以使用自定义值解析器修复。

我不会对您使用它负责,并且不会支持您使用它后的问题。