EF を使用して、質問に投稿されたものと基本的に同じクエリを作成できます。まず、プロパティ int PrivilegeID と int EmployeeID を持つ poco モデル EmployeePrivilege を作成しました。これを 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 Server と Oracle の両方に対して指定された特権を欠いている従業員を返します (Devart の dotConnect for Oracle を使用)。
私が読んだ多くの記事は DefaultIfEmpty()
を使用して言及されていました 左外部結合を実現します。上記のクエリは機能しますが、DefaultIfEmpty()
を使用してこの結果を得るより良い方法があれば投稿してください .