Você pode usar o EF para criar basicamente as mesmas consultas postadas na pergunta. Comecei criando um modelo poco EmployeePrivilege com propriedades:int PrivilegeID &int EmployeeID. Eu não adicionei isso ao 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;
Acabei de perceber que você também pode obter o mesmo resultado sem criar o poco EmployeePrivilege da seguinte forma:
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;
Ambas as consultas EF retornam Funcionários sem privilégios especificados no Sql Server e no Oracle (usando o dotConnect do Devart para Oracle).
Muitos posts que li se referiam ao uso de
DefaultIfEmpty()
para obter uma junção externa esquerda. As consultas acima funcionam, no entanto, poste se houver uma maneira melhor para esse resultado usando DefaultIfEmpty()
.