AutoMapper:将导航属性存储到用于映射的中间结果



在下面的映射中,我必须检查导航属性的存在,并在此基础上映射属性

.ForMember(x => x.IsReceived, opt => opt.MapFrom(x => x.DropOff.Contamination.Any(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault())))
.ForMember(x => x.ReceivedOn, opt => opt.MapFrom(x => x.DropOff.Contamination.Any(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()) ? x.DropOff.Contamination.FirstOrDefault(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()).MeasurementDate : null))
.ForMember(x => x.Receiver, opt => opt.MapFrom((x) => x.DropOff.Contamination.Any(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()) ? new LookupItem<string, string>
{
Id = x.DropOff.Contamination.Single(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()).ReceivedBy,
Value = FormattingHelper.GetStaffDisplayName(x.DropOff.Contamination.Single(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()).ReceivedByNavigation, null)
} : new LookupItem<string, string>()))

但你可以看到,我每次都要对的所有属性重复这个对象选择检查

x.DropOff.Contamination.Single(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault())

在自动映射器中有没有任何方法可以临时存储这个对象并将其用于多个属性,而不是每次都以这种方式选择它?

正如@LucianBargaoanu在评论中所建议的那样,我使用了IncludeMembers,它非常完美!

这就是我现在的实现方式

我在原始地图定义中包含了这样的属性

CreateMap<DropOffBarcodedEquipment, DropOffEquipmentBase>()
.IncludeMembers(x => x.DropOff.Contamination.FirstOrDefault(c => c.EquipmentId == x.EquipmentId && c.IsValidated.GetValueOrDefault()))

然后添加了从ContaminationDropOffEquipmentBase的映射

CreateMap<Contamination, DropOffEquipmentBase>()
.ForMember(x => x.IsReceived, opt => opt.MapFrom(x => x.MeasurementDate.HasValue))
.ForMember(x => x.ReceivedOn, opt => opt.MapFrom(x => x.MeasurementDate))
.ForMember(x => x.Receiver, opt => opt.MapFrom(x => new LookupItem<string, string>()
{
Id = x.ReceivedBy,
Value = FormattingHelper.GetStaffDisplayName(x.ReceivedByNavigation, null)
}));

这个组合很有魅力!

感谢@LucianBargaoanu

最新更新