【问题标题】:Entity Framework - Filtering rows with where() after include实体框架 - 在包含后使用 where() 过滤行
【发布时间】:2020-02-19 09:19:07
【问题描述】:

如果我有两个对象或模型如下:

   class School
    {
        ICollection<Student> students { get; set; }
    }

    class Student
    {
        string Name { get; set; }
        School school { get; set; }
        bool Deleted { get; set; }
    }

当试图让学校只包含未删除的学生时,为什么使用 where 子句无法正常工作?

var school = DatabaseContext.Schools
             .Include(x => x.Students)
             .Where(y => !y.Deleted).FirstOrDefault();

where子句不应该过滤没有被删除的学生吗?在不使用任何第三方库的情况下,也不允许在 include 中使用 where 子句。

【问题讨论】:

  • "where 子句不应该过滤未删除的学生 - 答案是它不应该做任何事情,这不会编译
  • @MichaelRandall 代码写得不是很好,因为它只是我的问题的一个示例/预览,如果我们正在讨论编译该特定代码
  • @RicardoPeres 您知道全局查询文件是 ef CORE 功能,而不是 ef?不?啊,太糟糕了。
  • 你没有错过 Student 类中的 School 属性吗?
  • @RicardoPeres 确实谢谢。

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

你需要走另一条路,即选择未删除的学生,然后从他们中投影学校:

var school = DatabaseContext.Students
                 .Where(s => !s.Deleted)
                 .Select(s => s.School)
                 .Distinct()
                 .FirstOrDefault();

这取决于 Student 类上的 School 属性,该属性在您的模型中不存在,可能被遗忘了。

【讨论】:

  • 如何使用 IQueryable() 来实现?通过删除 firstordefault?
  • 不明白你的问题。我的解决方案仅在您可以查询学生时才有效,也就是说,如果您公开一个学生属性或者如果您使用 Set. 进行查询
  • Iqueryable&lt;school&gt; school = DatabaseContext.Students.Where(s =&gt; !s.Deleted).Select(s =&gt; s.School).Distinct(); 的工作方式是否与您的解决方案相同?
  • 我觉得可以,试试看!
【解决方案2】:

这是你应该做的,以获得想要的结果

var result = mydbcontext.Schools
                        .Include(d => d.students)
                        .Where(d => d.Id == 1) //the where clause filters only Schools
                        .Select(x=>new School
                        {
                            Id=x.Id,
                            students =x.students.Where(s=>!s.Deleted).ToList()
                        })
                        .AsNoTracking()
                        .ToList();

【讨论】:

    【解决方案3】:

    它确实有效,但您将需要第三方库 - EntityFramework 不支持过滤的包含,我认为 EF Core(尽管它们在待办事项列表中是 iirc)。

    where子句可以过滤,但只能过滤掉顶层的完整对象,然后将includes扩展到子元素。

    你想要的是包含过滤或全局查询过滤器(过滤掉所有被删除的学生,除非我告诉你不要这样做)。

    https://entityframework-classic.net/ 这样做(免费,ef 的一个分支)

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多