0
votes

Mapper automapper Propriétés optionnelles multiples à la liste

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


0 commentaires

3 Réponses :


0
votes

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: xxx

puis vous pouvez l'utiliser comme: xxx


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires