2015-07-28 2 views
0

У меня есть запрос LINQ, который будет сортировать списки сотрудников компании и участников на собраниях компаний. Я хочу привлечь сотрудников, которые не Участники на собраниях. Таким образом, левое внешнее соединение, по-видимому, является лучшей стратегией LINQ. Когда я отлаживал и прошел через код, employeesNotInMeetings вернул всех сотрудников, не удалив сотрудников, которые встречались с участниками. Почему это нарушающее соединение не удаляет правильные записи списка?Left Outer Join LINQ

 //Query for all attendees who are employees 
     List<Attendee> employeesWhoAreAttendees = db.Attendees.Select(ea => ea).ToList(); 
     //Query for all employees in database 
     List<Employee> employees = db.Employees.Select(ee => ee).ToList(); 

     var employeesNotInMeetings = from emp in employees 
            join att in employeesWhoAreAttendees 
            on emp.EmployeeID equals att.EmployeeID into gj 
            from gji in gj.DefaultIfEmpty() 
            //If EmployeeID < 0, the attendee is not an employee 
            where emp.EmployeeID > 0 
            select emp; 
+1

Не должно быть вашего места 'gji == null' ? Кроме того, если вам не нужны эти списки в другом месте, было бы лучше сделать это как один запрос к БД. – juharr

ответ

2

попробовать что-то вроде этого:

employees.Where(x => employeesWhoAreAttendees.All(y => x.EmployeedID != y.EmployeeID)) 
0

Я думаю, вы, вероятно, хотите что-то вроде:

db.Employees.Where(e => !e.Attendees.Any()); 

Обратите внимание, что это если у вас есть внешний ключ устанавливается между служащих и участников, а также что навигационное свойство ICollection на Employee называется Attendees

Также обратите внимание, что вы обычно не должны звонить ToList() непосредственно на нефильтрованное DBSet. Он вернет всю таблицу в память, а затем сделает фильтрацию. Вы получите лучшую производительность, если вы позволите SQL сделать фильтрацию для вас.

0

Это то, что должно делать левое соединение: оно возвращает все записи с левой стороны (employees), даже если на правой стороне нет результата (employeesWhoAreAttendees). Если вы хотите, чтобы сотрудники не встречались на собраниях, - тогда вы должны использовать left excluding join и найти эти записи в таблице employees, где в таблице нет записи (null) employeesWhoAreAttendees