在使用 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));
是否有可能以某种方式避免 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));