AutoMapper展平嵌套的集合 [英] AutoMapper flatten nested collections
问题描述
我试图弄清楚如何将商户集合展平,每个商户都将订单集合包含到平坦的OrderViewModels列表中.
I try to figure out how to flatten a collection of Merchants, each containing a collection of Orders to a flat List of OrderViewModels.
这是我的DTO:
public class Merchant
{
public string MerchantName { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public string OrderId { get; set; }
}
这是视图模型:
public class OrderViewModel
{
public string MerchantName { get; set; }
public string OrderId { get; set; }
}
我的目标是将列表< Merchant> 展平为 List< OrderViewModel> ,而以下测试结构应生成6个视图模型:
My Goal is to flatten a List<Merchant> to a List<OrderViewModel> whereas the following test structure should result in 6 view models:
var myMerchants = new List<Merchant>
{
new Merchant
{
MerchantName = "Merchant X",
Orders = new List<Order>
{
new Order { OrderId = "Order 1"},
new Order { OrderId = "Order 2"},
new Order { OrderId = "Order 3"}
}
},
new Merchant
{
MerchantName = "Merchant Y",
Orders = new List<Order>
{
new Order { OrderId = "Order 4"},
new Order { OrderId = "Order 5"},
new Order { OrderId = "Order 6"}
}
}
};
var models = Mapper.Map<List<OrderViewModel>>(myMerchants);
推荐答案
由于根对象的基数不是1:1,(即2个根Merchants
需要映射到6个OrderViewModels
),您可以需要诉诸自定义TypeConverter
并在收集级别进行操作,您可以在其中使用.SelectMany
进行展平:
Because the cardinality of the root objects isn't 1:1, (i.e. 2 root Merchants
need to map to 6 OrderViewModels
), you may need to resort to a custom TypeConverter
and operate at the collection level, where you can use .SelectMany
to do the flattening:
public class MyTypeConverter : ITypeConverter<IEnumerable<Merchant>, List<OrderViewModel>>
{
public List<OrderViewModel> Convert(ResolutionContext context)
{
if (context == null || context.IsSourceValueNull)
return null;
var source = context.SourceValue as IEnumerable<Merchant>;
return source
.SelectMany(s => s.Orders
.Select(o => new OrderViewModel
{
MerchantName = s.MerchantName,
OrderId = o.OrderId
}))
.ToList();
}
}
然后您可以进行引导:
Mapper.CreateMap<IEnumerable<Merchant>, List<OrderViewModel>>()
.ConvertUsing<MyTypeConverter>();
然后这样映射:
var models = Mapper.Map<List<OrderViewModel>>(myMerchants);
这篇关于AutoMapper展平嵌套的集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!