LINQ-запрос для объединения двух наборов и фильтрации по набору результатов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть две таблицы

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

Этот список содержит школу с Идентификаторы 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 , тогда в таблице Student будет 2 строки - одна строка как студент с ID 3, а другая как учитель с ID 4.

Даже в этой ситуации я получу a.Считайте как 1, что неверно, поскольку мое постановление задачи: « Если по крайней мере одна школа, в которой нет учителя, возвращает true ». Как мне это решить?

1 Ответ

1 голос
/ 31 марта 2020

Вы можете сгруппировать students по schoolId до join, я попробовал этот код для 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;

Надеюсь, эта помощь

...