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