Du kan bruge EF til at oprette stort set de samme forespørgsler, der er skrevet i spørgsmålet. Jeg startede med at lave en poco-model EmployeePrivilege med egenskaber:int PrivilegeID &int EmployeeID. Jeg føjede ikke dette til 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;
Jeg har lige indset, at du også kan få det samme resultat uden at oprette Poco EmployeePrivilege som følger:
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;
Begge disse EF-forespørgsler returnerer medarbejdere, der mangler specificerede privilegier mod både SQL Server og Oracle (ved hjælp af Devarts dotConnect for Oracle).
Mange indlæg, som jeg læste, refererede til ved hjælp af DefaultIfEmpty()
for at opnå en venstre ydre sammenføjning. Forespørgslerne ovenfor virker, men skriv venligst, hvis der er en bedre måde til dette resultat ved hjælp af DefaultIfEmpty()
.