三行代码  ›  专栏  ›  技术社区  ›  Guilherme Machado Santana

AutoMapper在实体框架查询后不知从哪里带来数据

  •  2
  • Guilherme Machado Santana  · 技术社区  · 3 周前

    我正在使用 .NET核心7 实体框架核心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() 要作为参数传递给映射程序 哪里 这个条款很好用。为什么会发生这种情况?我不能用 .ToList() 因为它选择了我正在查询的类的所有属性。

    经过多次尝试,我意识到我的查询是可以的,我的问题在.ProjectTo()内部。 例如,如果我传递了一些不应该返回的论点 机器操作 ,查询实际上没有返回任何内容,这是可以的,但当查询的结果通过 .ProjectTo ,它神奇地找到了一些唱片并把它带给我。这对我来说真的没有任何意义。

    查询结果: enter image description here

    .ProjectTo()的结果: enter image description here

    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));
    
    1 回复  |  直到 3 周前
        1
  •  1
  •   Guru Stron    3 周前

    发生这种情况是因为使用 ProjectTo 相当于应用自定义 Select 在EF Core中进行查询(即自定义投影),结果 Include 正在被忽略(包括筛选器)。您可以尝试将过滤逻辑移动到映射表达式中(根据 AutoMapper docs 它应该工作)或在物化后应用映射(就像您的工作尝试一样),但这可能会导致获取额外的数据。