J'ai une classe de commande de classe que je souhaite mapper dans une classe de ligne de commande avec une liste de codes à barres. Les propriétés Barcode1,2,3 doivent être mappées sur des codes à barres uniquement si la valeur contient une valeur. Barcode1 est toujours rempli, BarCode2 et Barcode3 sont facultatifs. J'ai créé une cartographie mais cela me donne toujours 3 codes à barres dans la liste. Si barcode1 ou 2 est une chaîne vide, je ne veux pas les ajouter à la liste. Comment puis-je faire cela?
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 } }));
3 Réponses :
Pourquoi créez-vous toujours ces trois codes à barres?
Je vous suggérerais de créer une fonction pour le prédicat
Cela accepte le commandéLequest et renvoie votre liste et gérez la création dans la fonction. Comme ça: puis vous pouvez l'utiliser comme: p>
Si vous utilisez Comtableapper, l'étape consistant à ajouter trois propriétés spécifiques de la source à une liste dans la destination ne peut être accomplie avec une fonction simple. Vous devez dire à Coorapper comment l'accomplir.
Vous pouvez le faire en lui disant d'ignorer ces propriétés lors du mappage initial, puis d'ajouter des éléments à la liste de destination après que la mappage soit terminée. P>
Pour une brièveté, cela inclut uniquement les propriétés: P>
var configuration = new MapperConfiguration( cfg => cfg.CreateMap<OrderLineRequest, OrderLine>() .ForMember(d => d.Barcodes, opt => opt.Ignore()) .ForSourceMember(s => s.Barcode1, opt => opt.DoNotValidate()) .ForSourceMember(s => s.Barcode2, opt => opt.DoNotValidate()) .ForSourceMember(s => s.Barcode3, opt => opt.DoNotValidate()) .AfterMap((source, destination) => { destination.Barcodes = new List<Barcode> { new Barcode { Code = source.Barcode1 } }; if (source.Barcode2 != null) destination.Barcodes.Add(new Barcode { Code = source.Barcode2 }); if (source.Barcode3 != null) destination.Barcodes.Add(new Barcode { Code = source.Barcode3 }); }));
Créer un tableau des trois propriétés. Une fois que c'est dans un tableau, vous pouvez utiliser où code> pour supprimer les nulls et
sélectionnez code> pour instancier les instances code> EANCODE CODE>. Une fois que les données sont en bon état, appelez
tolist () code>.
.ForMember
(
d => d.BarCodes,
p => p.MapFrom
(
s =>
(new [] { s.BarCode1, s.BarCode2, s.BarCode3 })
.Where( x => x != null)
.Select( x => new EanCode { Code = x } )
.ToList()
)
);