VB.NET下AutoMapper复杂映射实现求助(版本6.2.2.0)
VB.NET下AutoMapper 6.2.2实现OrderA到OrderBList的完整映射方案
嘿,我看你在AutoMapper的VB.NET映射上卡壳了,其实核心问题是你之前的代码只处理了LineItem到OrderBList的表层映射,没把OrderA本身的OrderID和CustomerName传递给每个生成的OrderB对象。针对你用的AutoMapper 6.2.2版本,我给你整理了一套完整的实现方案:
首先先确认你的实体类结构(如果和你的实际代码有出入,调整对应属性名就行):
Public Class OrderA Public Property OrderID As Integer Public Property CustomerName As String Public Property OrderLineItem As List(Of OrderALineItem) End Class Public Class OrderALineItem Public Property ItemName As String Public Property ItemQty As Integer Public Property Price As Decimal End Class Public Class OrderBList Public Property OrderBs As List(Of OrderB) End Class Public Class OrderB Public Property OrderID As Integer Public Property CustomerName As String Public Property ItemName As String Public Property ItemQty As Integer Public Property Price As Decimal End Class
接下来是关键的AutoMapper配置和映射代码:
' 第一步:配置AutoMapper的映射规则 Dim mapperConfig = New MapperConfiguration(Sub(config) ' 先配置OrderALineItem到OrderB的基础映射(只处理Item相关属性) config.CreateMap(Of OrderALineItem, OrderB)() _ .ForMember(Function(dest) dest.OrderID, Sub(opt) opt.Ignore()) _ .ForMember(Function(dest) dest.CustomerName, Sub(opt) opt.Ignore()) ' 再配置OrderA到OrderBList的完整映射,重点处理OrderBs集合 config.CreateMap(Of OrderA, OrderBList)() _ .ForMember(Function(dest) dest.OrderBs, Sub(opt) ' 遍历OrderA的LineItem,先映射成OrderB,再注入OrderA的全局属性 opt.MapFrom(Function(src) src.OrderLineItem.Select(Function(lineItem) Dim orderB = config.CreateMapper().Map(Of OrderB)(lineItem) orderB.OrderID = src.OrderID orderB.CustomerName = src.CustomerName Return orderB End Function).ToList()) End Sub) End Sub) ' 第二步:创建映射器实例 Dim mapper = mapperConfig.CreateMapper() ' 第三步:执行映射,从OrderA对象得到完整的OrderBList Dim objOrderBList = mapper.Map(Of OrderBList)(objOrder)
代码逻辑说明:
- 先做基础映射:让AutoMapper知道OrderALineItem的属性怎么对应到OrderB的Item相关字段,同时忽略OrderID和CustomerName(因为这俩来自OrderA本身,不是LineItem的属性)。
- 然后处理OrderA到OrderBList的核心映射:通过
MapFrom遍历OrderA的OrderLineItem集合,把每个LineItem先转成OrderB,再手动把OrderA的OrderID和CustomerName赋值给每个OrderB,最后把这些OrderB打包成列表赋值给OrderBList的OrderBs属性。
特殊情况补充:
如果你的OrderBList是直接继承自List(Of OrderB)(而不是包含一个List属性),那配置代码可以改成这样:
' 假设OrderBList定义为:Public Class OrderBList Inherits List(Of OrderB) Dim mapperConfig = New MapperConfiguration(Sub(config) config.CreateMap(Of OrderALineItem, OrderB)() _ .ForMember(Function(dest) dest.OrderID, Sub(opt) opt.Ignore()) _ .ForMember(Function(dest) dest.CustomerName, Sub(opt) opt.Ignore()) config.CreateMap(Of OrderA, OrderBList)() _ .ConvertUsing(Function(src, dest, context) ' 先把LineItem转成OrderB列表 Dim orderBs = context.Mapper.Map(Of List(Of OrderB))(src.OrderLineItem) ' 给每个OrderB注入OrderA的属性 For Each orderB In orderBs orderB.OrderID = src.OrderID orderB.CustomerName = src.CustomerName Next ' 返回OrderBList实例 Return New OrderBList(orderBs) End Function) End Sub)
这样就能实现你要的完整映射了,每个OrderB都会同时拥有LineItem的商品属性和OrderA的订单、客户信息。
内容的提问来源于stack exchange,提问作者Sanal Nambiar
相关产品推荐
相关产品推荐

