LINQ查询以连接两个集并根据结果集进行过滤

时间:2020-03-31 12:09:02

标签: c# .net linq c#-4.0

我有两个桌子

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 将返回 3 条记录,这将导致以下一个用例失败。

。假设我只有一所学校与 School2 , 那么学生表中将有2行 -作为学生的ID为3的一行,以及 另一个是ID为4的老师。

即使在这种情况下,我也会得到 a.Count 为1,这是不正确的,因为我的问题陈述是“ 如果没有老师的Atleast一所学校返回了真” 。我该如何解决?

1 个答案:

答案 0 :(得分:1)

您可以在students之前将schoolIdjoin分组,我为Linq to Object尝试了此代码,一切正常:

1-为学生建立分组学校,并检查IsATeacher中每个school的所有students是否都是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;

我希望有帮助