Oracle
 sql >> Database >  >> RDS >> Oracle

come interrogare molti a molti per l'assenza di record usando EF5

Puoi usare EF per creare praticamente le stesse query pubblicate nella domanda. Ho iniziato creando un modello poco EmployeePrivilege con le proprietà:int PrivilegeID &int EmployeeID. Non l'ho aggiunto a 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;

Mi sono appena reso conto che puoi ottenere lo stesso risultato anche senza creare il poco EmployeePrivilege come segue:

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;

Entrambe queste query EF restituiscono ai dipendenti privi di privilegi specificati sia per Sql Server che per Oracle (usando dotConnect di Devart per Oracle).

Molti post che ho letto si riferivano all'utilizzo di DefaultIfEmpty() per ottenere un join esterno sinistro. Le query sopra funzionano, tuttavia, per favore pubblica se c'è un modo migliore per questo risultato usando DefaultIfEmpty() .