Anda dapat menggunakan EF untuk membuat kueri yang pada dasarnya sama dengan yang diposting dalam pertanyaan. Saya mulai dengan membuat model poco EmployeePrivilege dengan properti:int PrivilegeID &int EmployeeID. Saya tidak menambahkan ini ke 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;
Saya baru sadar Anda juga bisa mendapatkan hasil yang sama tanpa membuat Poco EmployeePrivilege sebagai berikut:
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;
Kedua kueri EF ini mengembalikan Karyawan yang kehilangan hak istimewa tertentu terhadap Sql Server dan Oracle (menggunakan dotConnect untuk Oracle dari Devart).
Banyak postingan yang saya baca merujuk menggunakan DefaultIfEmpty()
untuk mencapai gabungan luar kiri. Kueri di atas berfungsi, namun, harap posting jika ada cara yang lebih baik untuk hasil ini menggunakan DefaultIfEmpty()
.