我正在使用 .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
条款没有被应用。经过一番尝试,我意识到,如果我在查询末尾添加 .ToList()
并使用 .AsQueryable()
转换它并作为参数传递给映射器后,.Where
子句就可以正常工作。为什么会发生这种情况?我无法使用 .ToList()
,因为它选择了我正在查询的类的所有属性。
经过多次尝试,我意识到我的查询没问题,我的问题出在 .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));
发生这种情况是因为使用
ProjectTo
相当于应用自定义 Select
在 EF Core 中进行查询(即自定义投影),这会导致 Include
被忽略。如果您替换您可以尝试将过滤逻辑移至映射表达式中(也许通过使用中间类型来实现此目的,尽管我不确定它是否会起作用)或在物化后应用映射(正如您的工作尝试所做的那样)但它可能会导致获取额外的数据。