c# - 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 } }));
解决方案
为什么你总是创建这三个条形码?我建议您为接受 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)));