如何使用 AutoMapper 将客户数据从列表映射到客户 class

How to use AutoMapper to map Customer data from List to Customer class

我试图通过以下方式将客户数据从列表映射到客户 class,但没有得到正确的结果。该程序没有给出任何错误,而是生成了具有空值的客户数据。

    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 解决上述问题。

正如我所说 ,您不需要为此使用 AutoMapper。

这个:

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

将填写一份客户名单。那么你想要一个客户:

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

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

只有 select 一个 客户,并且 return 那:

Customer viewModel = oCustomer.FirstOrDefault();

如果您真的认为必须从列表映射到单个实体(同样,这在这种情况下毫无意义),请参阅 Mapping from list down to object with AutoMapper

如果您真的、真的必须使用 AutoMapper 将单个项目从列表映射到单个项目,并且您不想在列表上使用 FirstOrDefault(),您可以这样做(拼接一起来自 Projection - AutoMapper Wiki, How 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()。虽然我会警告你:当源列表为空时,这段代码会抛出异常,不容易维护并且会导致其他问题,其中一些问题可以使用自定义值解析器修复。

我不会对您使用它负责,也不会支持您使用它后提出的问题。