Bogdan Girnyk
Bogdan Girnyk

Reputation: 108

Avoid redundant LINQ computations during mapping of properties using AutoMapper

Is it possible to somehow avoid redundant computations of src.Purchases.MaxBy(p => p.PurchaseDate) in case below?

cfg.CreateMap<Customer, CustomerDto>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.LastPurchaseProduct, opt => opt.MapFrom(src => src.Purchases.MaxBy(p => p.PurchaseDate).Product))
    .ForMember(dest => dest.LastPurchaseQuantity, opt => opt.MapFrom(src => src.Purchases.MaxBy(p => p.PurchaseDate).Quantity))
    .ForMember(dest => dest.LastPurchaseTotalAmount, opt => opt.MapFrom(src => src.Purchases.MaxBy(p => p.PurchaseDate).TotalAmount));

Thanks in advance!

Upvotes: 0

Views: 84

Answers (2)

Bogdan Girnyk
Bogdan Girnyk

Reputation: 108

I managed to remove redundancy by using IncludeMembers. Thanks to Lucian Bargaoanu for advice.

cfg.CreateMap<Customer, CustomerDto>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .IncludeMembers(src => src.Purchases.MaxBy(p => p.PurchaseDate));
cfg.CreateMap<Purchase, CustomerDto>()
    .ForMember(dest => dest.LastPurchaseProduct, opt => opt.MapFrom(src => src.Product))
    .ForMember(dest => dest.LastPurchaseQuantity, opt => opt.MapFrom(src => src.Quantity))
    .ForMember(dest => dest.LastPurchaseTotalAmount, opt => opt.MapFrom(src => src.TotalAmount));

Upvotes: 2

Lucian Bargaoanu
Lucian Bargaoanu

Reputation: 3516

Add to Customer a LastPurchase property

[NotMapped]
public Purchase LastPurchase => _lastPurchase ??= Purchases.MaxBy(p => p.PurchaseDate);

And then all you need is CreateMap<Customer, CustomerDto>();. If you cannot modify Customer, you can use IncludeMembers.

Upvotes: 0

Related Questions