Oracle
 sql >> Datenbank >  >> RDS >> Oracle

wie man viele zu viele auf das Fehlen von Datensätzen mit EF5 abfragt

Sie können EF verwenden, um im Grunde die gleichen Abfragen zu erstellen, die in der Frage gepostet wurden. Ich begann mit der Erstellung eines Poco-Modells EmployeePrivilege mit Eigenschaften:int PrivilegeID &int EmployeeID. Ich habe dies nicht zum DbContext hinzugefügt.

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;

Ich habe gerade festgestellt, dass Sie das gleiche Ergebnis auch erhalten können, ohne das poco EmployeePrivilege wie folgt zu erstellen:

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;

Diese beiden EF-Abfragen geben Mitarbeiter zurück, denen bestimmte Berechtigungen sowohl für SQL Server als auch für Oracle (unter Verwendung von dotConnect für Oracle von Devart) fehlen.

Viele Beiträge, die ich gelesen habe, beziehen sich auf die Verwendung von DefaultIfEmpty() um einen linken äußeren Join zu erreichen. Die obigen Abfragen funktionieren, aber bitte posten Sie, ob es einen besseren Weg zu diesem Ergebnis gibt, indem Sie DefaultIfEmpty() verwenden .