Bạn có thể sử dụng EF để tạo về cơ bản các truy vấn giống được đăng trong câu hỏi. Tôi bắt đầu bằng cách tạo một mô hình poco EmployeePrivilege với các thuộc tính:int PrivilegeID &int EmployeeID. Tôi đã không thêm cái này vào 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;
Tôi vừa nhận ra rằng bạn cũng có thể nhận được kết quả tương tự mà không cần tạo poco EmployeePrivilege như sau:
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;
Cả hai truy vấn EF này đều trả về Nhân viên thiếu các đặc quyền được chỉ định đối với cả Sql Server và Oracle (sử dụng dotConnect của Devart cho Oracle).
Nhiều bài đăng mà tôi đã đọc tham khảo bằng cách sử dụng DefaultIfEmpty()
để đạt được kết nối bên ngoài bên trái. Các truy vấn trên hoạt động, tuy nhiên, vui lòng đăng nếu có cách tốt hơn để đạt được kết quả này bằng cách sử dụng DefaultIfEmpty()
.