我正在使用.NET Core7和AutoMapper 12,并try 创建从实体框架查询到DTO列表的映射.
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateProjection<MachineSchedule, MachineScheduleDataDto>()
.ForMember(m => m.ShiftsDto, opts => opts.MapFrom(m => AddShiftCondition(m.Shifts, shiftType.Value))) // HERE
.ForMember(m => m.ScheduledStopsDto, opts => opts.MapFrom(m => m.ScheduledStops))
.ForMember(m => m.MachineOperationsDto, opts => opts.MapFrom(m => m.MachineOperations));
cfg.CreateProjection<MachineOperation, MachineOperationDto>()
.ForMember(m => m.EggQuantitiesDto, opts => opts.MapFrom(m => m.EggQuantities));
cfg.CreateProjection<EggQuantity, EggQuantityDto>();
cfg.CreateProjection<Shift, ShiftDto>();
cfg.CreateProjection<ScheduledStop, ScheduledStopDto>();
});
var queryMapper = configuration.CreateMapper();
var diffDays = GetWeekdaysBetweenDates(startDate, endDate);
var test = queryMapper.ProjectTo<MachineScheduleDataDto>(_typedContext?
.AsNoTracking()
.Include(m => m.Shifts)
.Include(m => m.ScheduledStops)
.Include(m => m.MachineOperations)!
.ThenInclude(m => m.EggQuantities)
.OrderBy(m => m.MachineScheduleId));
正如你所看到的,我有方法AddShiftCondition:
private static IEnumerable<Shift>? AddShiftCondition(ICollection<Shift>? shifts, EShiftType? shiftType)
{
if (shifts != null && !shifts.Any())
return null;
if (shiftType.HasValue)
return shifts!.Where(s => s.Type == shiftType.Value);
return shifts;
}
我不知道为什么,但如果我使用.ProjectTo()
,AddShiftCondition就不会被调用,但如果我使用.Map()
,一切都很好:
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<MachineSchedule, MachineScheduleDataDto>()
.ForMember(m => m.ShiftsDto, opts => opts.MapFrom(m => AddShiftCondition(m.Shifts, shiftType.Value)))
.ForMember(m => m.ScheduledStopsDto, opts => opts.MapFrom(m => m.ScheduledStops))
.ForMember(m => m.MachineOperationsDto, opts => opts.MapFrom(m => m.MachineOperations));
cfg.CreateMap<MachineOperation, MachineOperationDto>()
.ForMember(m => m.EggQuantitiesDto, opts => opts.MapFrom(m => m.EggQuantities));
cfg.CreateMap<EggQuantity, EggQuantityDto>();
cfg.CreateMap<Shift, ShiftDto>();
cfg.CreateMap<ScheduledStop, ScheduledStopDto>();
});
var queryMapper = configuration.CreateMapper();
var diffDays = GetWeekdaysBetweenDates(startDate, endDate);
var test = queryMapper.Map<MachineScheduleDataDto>(_typedContext?
.AsNoTracking()
.Include(m => m.Shifts)
.Include(m => m.ScheduledStops)
.Include(m => m.MachineOperations)!
.ThenInclude(m => m.EggQuantities)
.FirstOrDefault());
为什么会发生这种事呢?