2015-07-28 2 views
0

J'ai une requête LINQ qui va trier les listes des employés de l'entreprise et des participants aux réunions d'entreprise. Je veux extraire les employés qui sont pas participants aux réunions. Ainsi, une jointure externe gauche semble être la meilleure stratégie LINQ. Lorsque j'ai débogué et franchi le code, employeesNotInMeetings a renvoyé tous les employés, ne parvenant pas à supprimer les employés qui rencontraient les participants. Pourquoi cette jointure externe gauche ne parvient-elle pas à supprimer les entrées de liste appropriées?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

Ne devrait pas être où 'gji == null' ? Aussi, sauf si vous avez besoin de ces listes ailleurs, il serait préférable de faire cela comme une requête à la base de données. – juharr

Répondre

2

Essayez quelque chose comme ceci:

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

Je penser que vous voulez probablement quelque chose comme:

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

Notez que cela supposant que vous avez une clé étrangère établie entre le tables de l'employé et du participant, et que la propriété de navigation ICollection sur Employee est nommée Attendees

Veuillez également noter que vous ne devez généralement pas appeler le ToList() directement sur un DBSet non filtré. Il va retirer toute la table en mémoire, puis faire le filtrage. Vous allez obtenir de meilleures performances si vous laissez SQL faire le filtrage pour vous.

0

C'est ce que doit faire une jointure gauche: elle renvoie toutes les entrées du côté gauche (employees) même s'il n'y a pas de résultat sur le côté droit (employeesWhoAreAttendees). Si vous voulez que les employés ne participent pas aux réunions, vous devez utiliser left excluding join et trouver les entrées dans la table employees où il n'y a pas d'entrée (nulle) dans la table employeesWhoAreAttendees