Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment interroger plusieurs à plusieurs pour l'absence d'enregistrements à l'aide de EF5

Vous pouvez utiliser EF pour créer essentiellement les mêmes requêtes publiées dans la question. J'ai commencé par créer un modèle poco EmployeePrivilege avec les propriétés :int PrivilegeID &int EmployeeID. Je n'ai pas ajouté ceci au DbContext.

var EmpPrivQuery = ctx.Privileges
                       .Where(p => p.PrivilegeName == "P3")
                       .SelectMany(p => p.Employees, (p, e) => new EmployeePrivilege{EmployeeID = e.EmployeeID, PrivilegeID = p.PrivilegeID}
                       .Distinct();

var employeesMissingPrivilege = from e in Employees
                                join epq in EmpPrivQuery
                                on e.EmployeeID equals epq.EmployeeID
                                into jointable
                                where jointable.Count()==0
                                select e;

Je viens de réaliser que vous pouvez également obtenir le même résultat sans créer le poco EmployeePrivilege comme suit :

var EmpPrivQuery = ctx.Privileges
                        .Where(p => p.PrivilegeName == "P3")
                        .SelectMany(p => p.Employees.Select(e => e.EmployeeID)
                        .Distinct();

var employeesMissingPrivilege = from e in Employees
                                join epq in EmpPrivQuery
                                on e.EmployeeID equals epq
                                into jointable
                                where jointable.Count()==0
                                select e;

Ces deux requêtes EF renvoient les employés manquant les privilèges spécifiés contre Sql Server et Oracle (en utilisant le dotConnect de Devart pour Oracle).

De nombreux messages que j'ai lus faisaient référence à l'utilisation de DefaultIfEmpty() pour obtenir une jointure externe gauche. Les requêtes ci-dessus fonctionnent, cependant, veuillez poster s'il existe un meilleur moyen d'obtenir ce résultat en utilisant DefaultIfEmpty() .