You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:03