LINQ 查询加入两个集合并过滤结果集

LINQ query to join two sets and filter on the result set

我有两个table

School
ID  Name 
1   School1
2   School2

Student
ID  SchoolID IsAStudent  IsATeacher
1    1             1         0
2    1             1         0
3    2             1         0
4    2             0         1

public class School
{
 public int ID {get;set;}
 public string Name {get;set;}
}

我有一个List<School> school= new List<School>();

输入:

School s1 = new School() { ID =1 ,Name ="School1"};
School s2 = new School() {ID= 2, Name = "School2"};
school.Add(s1);
school.Add(s2);

此列表包含 ID 为 1 和 2 的学校。

预期输出:

我需要检查是否至少其中一所学校没有老师。

在我们的示例中,由于 School1 没有老师,我应该从以下函数中得到 true

public bool IsTeacherNotPresentAtleastInOneSchool(List<School> school)
{
  var a = (from b in school
           join c in _studentEntity.GetAll()
           on b.ID equals c.SchoolID
           where c.IsATeacher == false
           select b).ToList();
 if(a.Count >0)
   return true;
 else
   return false;
}

虽然上面的用例会通过,但是a.Count会return3条记录导致一个用例下面失败。

。假设我只有一所学校 School2 , 那么 Student table 中会有 2 行 - 作为 ID 为 3 的学生排成一排,并且 另一个是 ID 为 4 的老师。

即使在这种情况下,我也会得到 a.Count 作为 1,这是不正确的,因为我的问题陈述是“If Atleast one School which doesn't老师 return 正确”。我该如何解决?

您可以在 join 之前通过 schoolIdstudents 进行分组,我为 Linq to Object 尝试了此代码,并且效果很好:

1 - 为学生建立分组学校,并检查 schoolin students 中的每个 IsATeacher 是否都是 false

var groupedSchool = _studentEntity.GetAll()
    .GroupBy(x => x.SchoolID)
    .ToDictionary(k => k.Key, v => v.All(x => !x.IsATeacher));

结果 1:


SchoolID  IsDontHasTeacher
1          true
2          false

2 - 将现有的 Query 更改为:

var a = (from b in schools
         join c in groupedSchool
         on b.ID equals c.Key 
         where c.Value == true
         select b).ToList();
return a.Count > 0;

希望对您有所帮助