Możesz użyć EF do tworzenia zasadniczo tych samych zapytań opublikowanych w pytaniu. Zacząłem od stworzenia modelu poco EmployeePrivilege z właściwościami:int PrivilegeID i int EmployeeID. Nie dodałem tego do 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;
Właśnie zdałem sobie sprawę, że możesz uzyskać ten sam wynik bez tworzenia poco EmployeePrivilege w następujący sposób:
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;
Obie te kwerendy EF zwracają pracowników, którzy nie mają określonych uprawnień względem zarówno SQL Server, jak i Oracle (przy użyciu dotConnect firmy Devart dla Oracle).
Wiele postów, które przeczytałem, odnosiło się do użycia DefaultIfEmpty()
aby uzyskać lewe sprzężenie zewnętrzne. Powyższe zapytania działają, jednak proszę opublikuj, jeśli istnieje lepszy sposób na uzyskanie tego wyniku za pomocą DefaultIfEmpty()
.