Можете да използвате EF, за да създадете основно същите заявки, публикувани във въпроса. Започнах със създаване на poco модел EmployeePrivilege със свойства:int PrivilegeID &int EmployeeID. Не съм добавил това към 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;
Току-що разбрах, че можете също да получите същия резултат, без да създавате poco EmployeePrivilege, както следва:
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;
И двете от тези EF заявки връщат служители, на които липсват определени привилегии както срещу Sql сървър, така и срещу Oracle (използвайки dotConnect на Devart за Oracle).
Много публикации, които прочетох, се отнасят до използването на DefaultIfEmpty()
за постигане на ляво външно съединение. Заявките по-горе работят, но моля, публикувайте, ако има по-добър начин за този резултат чрез DefaultIfEmpty()
.