C# 实体框架-筛选包含后带有where()的行

C# 实体框架-筛选包含后带有where()的行,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,如果我有两个对象或模型,如下所示: class School { ICollection<Student> students { get; set; } } class Student { string Name { get; set; } School school { get; set; } bool Deleted { get; set; } } where子句不应

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

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

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

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

您需要选择另一种方式,即选择未删除的学生,并从中预测学校:

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

这取决于
学生
类上的
学校
属性,该属性在您的模型中不存在,可能已被遗忘。

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

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

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


这样做(免费,一叉ef)

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

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();

“where子句不应该过滤没有被删除的学生吗?答案是它不应该做任何事情,这不会compile@MichaelRandall这段代码写得不是很好,因为它只是我问题的一个示例/预览,如果我们谈论编译特定的代码的话code@RicardoPeres您知道全局查询过滤器是ef核心功能不在ef中?不?啊,太糟糕了。你不是错过了学生课堂上的学校财产吗?@RicardoPeres真的很感谢。你怎么能用IQueryable()做到这一点?通过删除firstordefault?不理解您的问题。我的解决方案仅在您可以查询学生时有效,即,如果您公开了一个学生属性,或者使用Set.Will
Iqueryable school=DatabaseContext.students.Where(s=>!s.Deleted)。选择(s=>s.school)。Distinct()
与您的解决方案相同吗?我想是的,试一试!
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();