在使用 AutoMapper 映射属性期间避免冗余的 LINQ 计算

Avoid redundant LINQ computations during mapping of properties using AutoMapper

是否有可能以某种方式避免 src.Purchases.MaxBy(p => p.PurchaseDate) 在以下情况下的冗余计算?

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

提前致谢!

添加到Customer一个LastPurchase属性

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

然后您只需要 CreateMap<Customer, CustomerDto>();。如果无法修改Customer,可以使用IncludeMembers.

我设法通过使用 IncludeMembers 消除了冗余。 感谢 Lucian Bargaoanu 的建议。

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