我使用的是.NET Core 7、Entity Framework Core 7.0.13和AutoMapper 12.0.3,我有以下查询:
var test = _context.Set<T>
.AsNoTracking()
.Include(m => m.MachineOperations!
.Where(m =>
m.InsertedAt.Date <= endDate.Date &&
m.EndTime <= endDate.TimeOfDay &&
m.InsertedAt.Date >= startDate.Date &&
m.StartTime >= startDate.TimeOfDay))
.ThenInclude(m => m.EggQuantities)
.Where(m =>
diffDays.Contains(m.WeekDay) &&
m.MachineOperations!.Any() &&
m.InitialProductionTime <= startDate.TimeOfDay &&
m.FinalProductionTime >= startDate.TimeOfDay);
var test2 = _mapper.ProjectTo<MachineScheduleDataDto>(test);
我的问题是,.Where
条款没有得到执行.经过几次try ,我意识到如果在查询的末尾添加一个.ToList()
,然后使用.AsQueryable()
将其转换为参数传递给映射器,那么.Where
子句可以正常工作.为什么会这样?我不能使用.ToList()
,因为它 Select 了我正在查询的类的所有属性.
经过多次try ,我意识到我的查询是正确的,我的问题出在.ProjectTo()的内部.
例如,如果我传递了一些不应该返回任何MachineOperation的参数,查询实际上不会返回任何东西,这是可以的,但当查询的结果通过.ProjectTo
时,它会神奇地找到一些记录并将其带给我.这对我来说真的没有任何意义.
MachineScheduleDataDto类:
public record MachineScheduleDataDto
{
public required ICollection<MachineOperationDto> MachineOperationsDto { get; set; }
}
public record MachineOperationDto
{
public int MachineOperationId { get; set; }
public EMachineStatus MachineStatus { get; set; }
public virtual required MachineScheduleDataDto MachineScheduleDto { get; set; }
}
我的映射器:
CreateMap<MachineSchedule, MachineScheduleDataDto>()
.ForMember(p => p.MachineOperationsDto, opts => opts.MapFrom(m => m.MachineOperations));
CreateMap<MachineOperation, MachineOperationDto>()
.ForMember(p => p.MachineScheduleDto, opts => opts.MapFrom(m => m.MachineSchedule));