Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como consultar muitos para muitos pela ausência de registros usando o EF5


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