sql >> データベース >  >> RDS >> Oracle

EF5 を使用してレコードがないことを多対多でクエリする方法

    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() を使用してこの結果を得るより良い方法があれば投稿してください .




    1. T-sql組み込み関数で部分文字列を取得する方法

    2. Oracle:2つの異なるクエリをLIKEとINの1つにマージ

    3. 大規模なデータベーステーブル用のSQLオプティマイザ

    4. 2つのSELECTステートメントとUNIONとMySQL-PHPの他のすべてのパフォーマンス/効率