AutoMapper 在实体框架查询后将数据从无处移出

AutoMapper bringing data out of nowhere after Entity Framework Query

提问人:guirms 提问时间:11/9/2023 更新时间:11/9/2023 访问量:52

问:

我正在使用 .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

查询结果: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));
.NET 实体框架 LINQ ORM 自动映射器

评论

2赞 Guru Stron 11/9/2023
仅供参考,您不需要 .IncludeProjectTo
0赞 guirms 11/9/2023
但是,我将如何过滤包含的实体呢?
0赞 Gert Arnold 11/9/2023
请查看此内容以了解有关 的所有信息。Include

答:

1赞 Guru Stron 11/9/2023 #1

发生这种情况的原因是,using 等效于将自定义应用于 EF Core 中的查询(即自定义投影),这会导致 被忽略(包括筛选器)。您可以尝试将过滤逻辑移动到映射表达式中(也许通过使用中间类型,根据 AutoMapper 文档,它应该可以工作)或在具体化后应用映射(就像您的工作尝试一样),但这可能会导致获取额外的数据。ProjectToSelectInclude

评论

1赞 Lucian Bargaoanu 11/9/2023
docs.automapper.org/en/latest/......
1赞 Guru Stron 11/9/2023
@LucianBargaoanu谢谢,更新了带有链接的答案!