我试图弄清楚如何将商户集合展平,每个商户都将订单集合包含到平坦的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展平嵌套的集合
发布评论