U kunt EF gebruiken om in principe dezelfde query's te maken die in de vraag zijn gepost. Ik ben begonnen met het maken van een poco-model EmployeePrivilege met eigenschappen:int PrivilegeID &int EmployeeID. Ik heb dit niet toegevoegd aan de 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;
Ik realiseerde me net dat je hetzelfde resultaat ook kunt krijgen zonder de poco EmployeePrivilege als volgt te maken:
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;
Beide EF-query's retourneren Werknemers die gespecificeerde privileges missen voor zowel Sql Server als Oracle (met behulp van Devart's dotConnect voor Oracle).
Veel berichten die ik las, verwezen naar het gebruik van DefaultIfEmpty()
om een left outer join te bereiken. De bovenstaande query's werken, maar post als er een betere manier is om dit resultaat te krijgen met DefaultIfEmpty()
.