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()
)
);