My application needs to display a table of customer data, including data about the customer and about his most recent order from a given warehouse. The customer domain object contains a GetLatestOrder(warehouseId) method.
I have a CustomerView viewmodel and want to be able to populate it with some fields from the customer object, and a few fields from the latest order object. Can I do this using Automapper?
Try this,
In Global.asax.cs [Application_Start], public static void AppInitialize()
protected void Application_Start(object sender, EventArgs e) { Mapper.CreateMap() .ForMember(destination => destination.OrderId, options => options.MapFrom(source => source.Id)) .ForMember(destination => destination.OrderName, options => options.MapFrom(source => source.Name)); Mapper.CreateMap() .ForMember(destination => destination.CustmerId, options => options.MapFrom(source => source.Id)) .ForMember(destination => destination.CustmerName, options => options.MapFrom(source => source.Name)) .ForMember(destination => destination.OrderId, options => options.MapFrom(source => Mapper.Map, IEnumerable>(source.Orders).FirstOrDefault().OrderId)) .ForMember(destination => destination.OrderName, options => options.MapFrom(source => Mapper.Map, IEnumerable>(source.Orders).FirstOrDefault().OrderName)); }
And in your code call the mapper like below,
var lstCustomers = new List { new Customer { Id = 1, Name="Name", Orders = new List { new Order { Id = 1000, Name ="Some Name"}}}, }; var result = Mapper.Map, IEnumerable>(lstCustomers);
I am presumed that you classes looks like below,
public class Customer { public int Id { get; set; } public string Name { get; set; } public List Orders { get; set; } } public class Order { public int Id { get; set; } public string Name { get; set; } } public class CustomerViewModel { public int CustmerId { get; set; } public string CustmerName { get; set; } public int OrderId { get; set; } public string OrderName { get; set; } }
Also refer this post.
Yes, you can:
var vm = new CustomerViewModel(); Mapper.Map(customer, vm); Mapper.Map(order, vm);
Each mapping will populate the properties it is configured to and leave the rest.
In the end, I took the easy approach, couldn't find another way:
In Application_start:
Mapper.CreateMap(); Mapper.CreateMap();
In the controller method:
IEnumerable customers = GetCustomers(false) .OrderBy(c => c.Name); IEnumerable viewData = Mapper.Map, IEnumerable>(customers); foreach (Customer customer in customers) { CustomerView view = viewData.Where(cv => cv.CustomerId == customer.CustomerId).First(); Mapper.Map(customer.GetLatestOrder(WarehouseId), view); }