首页 > 解决方案 > Automapper 将多个可选属性映射到列表

问题描述

我有一个 OrderLineRequest 类,我想将它映射到带有条形码列表的 OrderLine 类。仅当属性 Barcode1、2、3 包含值时,才需要将其映射到 Barcodes。Barcode1 始终填写,Barcode2 和 Barcode3 是可选的。我创建了一个映射,但这总是给我列表中的 3 个条形码。如果 Barcode1 或 2 是空字符串,我不想将它们添加到列表中。我怎样才能做到这一点?

public class OrderLineRequest
{
    public string OrderLineId { get; set; }
    public string Barcode1 { get; set; }
    public string Barcode2 { get; set; }
    public string Barcode3 { get; set; }
    public int Quantity { get; set; }
}

public class OrderLine
{
    public int Id { get;set;}
    public int OrderId { get;set;}
    public string OrderLineNumber { get; set; }
    public int Qty { get; set; }
    public List<Barcode> Barcodes { get;set;}
}

public class Barcode
{
    public int Id { get;set;}
    public int OrderLineId { get;set;}
    public string Code { get;set;}
}

CreateMap<OrderLineRequest, OrderLine>()
            .ForMember(b => b.Id, e => e.Ignore())
            .ForMember(d => d.OrderId, p => p.Ignore())
            .ForMember(d => d.OrderLineNumber, p => p.MapFrom(s => s.OrderLineId))
            .ForMember(d => d.Qty, p => p.MapFrom(s => s.Quantity))
            .ForMember(d => d.BarCodes, p => p.MapFrom(s => new List<EanCode>() { new EanCode(){Code = s.Barcode1}, new EanCode() { Code = s.Barcode2 }, new EanCode() { Code = s.Barcode3 } }));

标签: c#automapper

解决方案


为什么你总是创建这三个条形码?我建议您为接受 OrderLineRequest 并返回您的 List 并在函数内处理创建的谓词创建一个函数。像那样:

private List<EanCode> Foo(OrderLineRequest orderLineRequest)  
{
    var result = new List<EanCode>();
    if(!string.IsNullOrEmpty(orderLineRequest.Barcode1) 
    result.Add(new EanCode {Code = orderLineRequest.Barcode1});
    //... 
    return result; 
}    

然后你可以像这样使用它:

.ForMember(d => d.BarCodes, p => p.MapFrom(s =>  Foo(s)));

推荐阅读