私のアプリケーションは、顧客に関するデータや特定の倉庫からの最新の注文に関するデータなど、顧客データのテーブルを表示する必要があります。顧客ドメインオブジェクトには、GetLatestOrder(warehouseId)メソッドが含まれています。
CustomerViewビューモデルがあり、customerオブジェクトのいくつかのフィールドと、最新のorderオブジェクトのいくつかのフィールドを入力できるようにしたいと考えています。Automapperを使用してこれを行うことはできますか?
私のアプリケーションは、顧客に関するデータや特定の倉庫からの最新の注文に関するデータなど、顧客データのテーブルを表示する必要があります。顧客ドメインオブジェクトには、GetLatestOrder(warehouseId)メソッドが含まれています。
CustomerViewビューモデルがあり、customerオブジェクトのいくつかのフィールドと、最新のorderオブジェクトのいくつかのフィールドを入力できるようにしたいと考えています。Automapperを使用してこれを行うことはできますか?
これを試して、
Global.asax.cs
[ Application_Start
]では、public static void AppInitialize()
protected void Application_Start(object sender, EventArgs e)
{
Mapper.CreateMap<Order, CustomerViewModel>()
.ForMember(destination => destination.OrderId, options => options.MapFrom(source => source.Id))
.ForMember(destination => destination.OrderName, options => options.MapFrom(source => source.Name));
Mapper.CreateMap<Customer, CustomerViewModel>()
.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<Order>, IEnumerable<CustomerViewModel>>(source.Orders).FirstOrDefault().OrderId))
.ForMember(destination => destination.OrderName, options => options.MapFrom(source => Mapper.Map<IEnumerable<Order>, IEnumerable<CustomerViewModel>>(source.Orders).FirstOrDefault().OrderName));
}
そして、あなたのコードで、以下のようにマッパーを呼び出します、
var lstCustomers = new List<Customer>
{
new Customer { Id = 1, Name="Name", Orders = new List<Order> { new Order { Id = 1000, Name ="Some Name"}}},
};
var result = Mapper.Map<IEnumerable<Customer>, IEnumerable<CustomerViewModel>>(lstCustomers);
あなたのクラスは以下のようになっていると思いますが、
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public List<Order> 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; }
}
この投稿も参照してください。
はい、できます:
var vm = new CustomerViewModel();
Mapper.Map(customer, vm);
Mapper.Map(order, vm);
各マッピングは、構成されているプロパティにデータを入力し、残りを残します。
結局、私は簡単なアプローチを取りましたが、別の方法を見つけることができませんでした:
Application_startの場合:
Mapper.CreateMap<Customer, CustomerView>();
Mapper.CreateMap<Order, CustomerView>();
コントローラ方式の場合:
IEnumerable<Customer> customers = GetCustomers(false)
.OrderBy(c => c.Name);
IEnumerable<CustomerView> viewData = Mapper.Map<IEnumerable<Customer>, IEnumerable<CustomerView>>(customers);
foreach (Customer customer in customers)
{
CustomerView view = viewData.Where(cv => cv.CustomerId == customer.CustomerId).First();
Mapper.Map(customer.GetLatestOrder(WarehouseId), view);
}