如何使用 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()
。虽然我会警告你:当源列表为空时,这段代码会抛出异常,不容易维护并且会导致其他问题,其中一些问题可以使用自定义值解析器修复。
我不会对您使用它负责,也不会支持您使用它后提出的问题。
我试图通过以下方式将客户数据从列表映射到客户 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
解决上述问题。
正如我所说
这个:
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()
。虽然我会警告你:当源列表为空时,这段代码会抛出异常,不容易维护并且会导致其他问题,其中一些问题可以使用自定义值解析器修复。
我不会对您使用它负责,也不会支持您使用它后提出的问题。