如何在AutoMapper中对订单列表项实现已开票条件映射?
解决方案
你只需要在OrderDto到Order的映射配置里,给OrderItems的MapFrom添加LINQ过滤逻辑,筛选出符合条件的OrderLine即可,具体修改如下:
CreateMap<OrderDto, Order>() .ForMember(dest => dest.TransactionId, opt => opt.MapFrom(src => CreateTransactionId(src.OrderHeader))) .ForMember(dest => dest.TransactionType, opt => opt.MapFrom(src => MapTransactionType(src.OrderHeader.OrderType))) // 新增过滤逻辑:仅保留包含'Invoiced'类型数量记录的OrderLine .ForMember(dest => dest.OrderItems, opt => opt.MapFrom(src => src.OrderLine.Where(line => line.Quantity.Any(q => q.Type == "Invoiced")) )) .ReverseMap(); CreateMap<OrderLineDto, OrderItem>() .ForMember(dest => dest.LineNumber, opt => opt.MapFrom(src => src.LineNumber)) .ForMember(dest => dest.Upc, opt => opt.MapFrom(src => src.Item.Upc)) .ForMember(dest => dest.Sku, opt => opt.MapFrom(src => src.Item.Upc)) .ReverseMap();
说明
- 通过LINQ的
Where方法对原列表src.OrderLine做筛选,内部用Any方法检查当前OrderLine的Quantity集合中是否存在Type为'Invoiced'的条目 - 该逻辑直接嵌入
MapFrom中,AutoMapper会自动将筛选后的列表映射为OrderItems,无需额外修改OrderLineDto到OrderItem的单条映射规则(除非你还需要对单个订单项的字段做条件过滤)
内容的提问来源于stack exchange,提问作者ChrisP
相关产品推荐
相关产品推荐

