EF můžete použít k vytvoření v podstatě stejných dotazů zveřejněných v otázce. Začal jsem vytvořením poco modelu EmployeePrivilege s vlastnostmi:int PrivilegeID &int EmployeeID. Nepřidal jsem to 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;
Právě jsem si uvědomil, že stejného výsledku můžete získat také bez vytvoření poco EmployeePrivilege následovně:
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;
Oba tyto dotazy EF vracejí zaměstnance, kterým chybí specifikovaná oprávnění jak vůči SQL Server, tak Oracle (pomocí Devart's dotConnect for Oracle).
Mnoho příspěvků, které jsem četl, odkazovalo na použití DefaultIfEmpty()
k dosažení levého vnějšího spojení. Výše uvedené dotazy však fungují, pokud však existuje lepší způsob, jak dosáhnout tohoto výsledku pomocí DefaultIfEmpty()
, zveřejněte je .