【问题标题】:Exclude deleted child when using EF core Include使用 EF 核心包含时排除已删除的子项
【发布时间】:2020-01-20 14:46:02
【问题描述】:

这是我的实体结构:


我的代码用于获取所有子 TestsCourses

var course = await Db.Courses.Include(x => x.Tests).FirstOrDefaultAsync(y => y.CourseId == id);

它包括与课程相关的所有子测试。但我想包括所有未删除状态的测试 (IsDeleted = false)。为此,我使用了以下代码:

var course = await Db.Courses.Include(x => x.Tests.Where(y=>!y.IsDeleted)).FirstOrDefaultAsync(y => y.CourseId == id);

但它不排除已删除的测试。谁能告诉我如何排除已删除的测试?

【问题讨论】:

    标签: linq asp.net-core entity-framework-core


    【解决方案1】:

    我得到了我的解决方案。我通过添加如下全局过滤器来解决它:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    
        builder.Entity<Test>().HasQueryFilter(p => !p.IsDeleted);
    }
    

    详细解释here

    【讨论】:

    • 但是,如果您想要所有记录,包括 IsDeleted = true 的记录,该怎么办?根据您链接的文档,在这种情况下您需要使用IgnoreQueryFilters()。您应该将自己的答案标记为已接受! +1
    【解决方案2】:

    常规包含不能与过滤器一起使用。您需要从 nuget 下载 Z.EntityFramework.Plus.EFCore。并使用下面的代码

    var course = await Db.Courses.Where(y => y.CourseId == id).IncludeFilter(x => x.Tests.Where(y => y.IsDeleted == false)).FirstOrDefaultAsync;
    

    【讨论】:

      【解决方案3】:

      您无法在 EF 核心中的 Include 中进行过滤,请尝试改用以下代码

      var course = await Db.Courses.Include(x => x.Tests).FirstOrDefaultAsync(y => y.CourseId == id);
      course.Tests = course.Tests.Where(t => !t.IsDeleted).ToList();
      

      参考Filtering on Include in EF Core

      【讨论】:

      • 这是一个很好的解决方案,但似乎有点贵。我通过浏览文档添加了一个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多