AutoMapper展平嵌套的集合

编程入门 行业动态 更新时间:2024-10-27 12:35:22
本文介绍了AutoMapper展平嵌套的集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

本文发布于:2023-11-17 06:33:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1609167.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   AutoMapper

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!