sql >> Base de Datos >  >> RDS >> Oracle

cómo consultar muchos a muchos por la ausencia de registros usando EF5

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