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()
.