Puede usar EF para crear básicamente las mismas consultas publicadas en la pregunta. Comencé creando un modelo poco EmployeePrivilege con propiedades:int PrivilegeID &int EmployeeID. No agregué esto al 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;
Me acabo de dar cuenta de que también puede obtener el mismo resultado sin crear el privilegio de empleado de poco de la siguiente manera:
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 consultas de EF devuelven empleados a los que les faltan privilegios específicos contra Sql Server y Oracle (utilizando dotConnect de Devart para Oracle).
Muchas publicaciones que leí se referían al uso de DefaultIfEmpty()
para lograr una combinación externa izquierda. Las consultas anteriores funcionan, sin embargo, publique si hay una mejor manera de obtener este resultado usando DefaultIfEmpty()
.