首页 > 解决方案 > 允许 IgnoreQueryFilters 后跟选择查询

问题描述

我正在使用带有软删除功能的 ef core V2.1。

我尝试使用 IgnoreQueryFilters() 方法获取一个学生,以及他所有的里程碑记录(包括一些已删除的记录)。

但是虽然我可以这样做:

applicationDbContex.Students
.IgnoreQueryFilters().Include("Milestones.Type")
.Where(...)
.ToArray();

当我尝试在 where 子句之后添加一个 select 语句时,它没有获取已删除的里程碑。

applicationDbContex.Students
     .IgnoreQueryFilters().Include("Milestones.Type").ToArray();         
     .Where(...)
     .Select(s => new {
         PersonalNumber = s.PersonalNumber,
         Milestones = s.Milestones 
     })

这是我正在使用的简化模型:

public class Student {

    public ICollection<Milestone > Milestones {get; set;}
}

public class Milestone {
    ..
    public MilestoneType type {get; set;}
    ..
}

public class MileStoneType {
    ..
    public int Id {get; set;}
    ..
}

关于可能是什么问题的任何建议?

编辑:

我想声明,我在 startup.cs 中使用了“UseLazyLoadingProxies()”

 services.AddDbContext<ApplicationDbContext>(options => 
                options.UseLazyLoadingProxies()
                    .UseSqlServer(connectionString)
            );

看来,为了选择查询工作,我必须获取一个完整的对象,例如,如果我之前使用以下代码,该代码才有效:

 applicationDbContext.Soldiers.IgnoreQueryFilters()
            .Include("Milestones.Type").Load();

标签: c#entity-framework-coresoft-delete

解决方案


您必须在 where 和 select 之前调用 ignoreQueryFilter

applicationDbContex.Students.IgnoreQueryFilters().Where(...)
     .Select(s => new {
         PersonalNumber = s.PersonalNumber,
         Milestones = s.Milestones 
     })
     .Include("Milestones.Type").ToArray();

当你使用 Select 时,Include 是没用的!


推荐阅读