我使用的是.NET Core 7Entity Framework Core 7.0.13AutoMapper 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时,它会神奇地找到一些记录并将其带给我.这对我来说真的没有任何意义.

Result of the query: enter image description here

Result of the .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));

推荐答案

这是因为使用ProjectTo相当于将自定义Select应用于EF Core中的查询(即自定义投影),从而导致Include‘S被忽略(包括过滤器).您可以try 将过滤逻辑移动到映射表达式中(可能使用中间类型,根据它应该起作用的AutoMapper docs),或者在materialized 之后应用映射(正如您的工作try 所做的那样),但这可能会导致获取额外的数据.

.net相关问答推荐

升级到.NET8后,SignalR(在坞站容器上)网关损坏

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

Dotnet 反射:使用 F# 中的out参数调用 MethodInfo 上的调用

process.WaitForExit() 异步

每 X 秒执行一次指定函数

C# 的部分类是糟糕的设计吗?

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

C#:内存不足异常

如何根据新的安全策略在 .Net 中发送邮箱?

C# 相当于 Java 的 <?在泛型中扩展 Base>

覆盖方法上的 C# 可选参数

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

如何异步 Files.ReadAllLines 并等待结果?

如何在 RabbitMQ 中设置重试次数?

CryptographicException 未处理:系统找不到指定的文件

我应该如何删除 DbSet 中的所有元素?

DateTime.Compare 如何判断日期是否小于 30 天?

Windows 服务在哪个目录中运行?

序列化一个可为空的 int