3

Entity Framework (EF) ナビゲーション プロパティでの LINQ クエリのフィルター処理についてサポートが必要です。テーブルは最初に作成されました (コード ファーストではありません)。

この問題では、The Office のキャラクターを使用してみましょう。

次のテーブルと列があるとします。

Offices
    Id
    Name
    Location

Employees
    Id
    Name

EmployeeTypes
    Id
    Description

Employees_EmployeeTypes
    Id
    EmployeeId
    EmployeeTypeId

テーブルには次のデータがあります。

Offices
    1   North Branch    PA
    2   South Branch    FL
    3   East Branch     NY

Employees
    1   Jim
    2   Pam
    3   Oscar
    4   Dwight
    5   Michael
    6   Angela
    7   Kevin
    8   Stanley

EmployeeTypes
    1   Manager
    2   Salesman
    3   Assistant
    4   Receptionist
    5   Accountant

Employees_EmployeeTypes
    1   1   2
    2   2   4
    3   3   5
    4   4   2
    5   5   1
    6   6   5
    7   7   5
    8   8   2

これらのテーブルは、Visual Studio の [データベースからモデルを更新] 機能を使用して EF に取り込まれます。

すべてのエンティティはテーブル名とまったく同じように命名され、エンティティ セットは複数形になります。

Entity Name     Entity Set Name
Office          Offices
Employee        Employees
EmployeeType    EmployeeTypes

Employees_EmployeeTypes テーブルはジャンクション テーブル (多対多) であり、EF のナビゲーション プロパティに変換され、"EmployeeTypes" という名前が付けられます。以下は、その使用例です。

var employeeTypes = dbContext.Employees.Find(1).EmployeeTypes;

設定ができたので、質問に行きましょう。LINQ を使用して、ナビゲーション プロパティ "EmployeeTypes" を使用してセールスマンであるすべての従業員を選択するにはどうすればよいですか? SQL では、次のようになります。

select e.Id, e.Name
from Employees e
join Employees_EmployeeTypes e_et on e_et.EmployeeId = e.Id
join EmployeeTypes et on et.Id = e_et.EmployeeTypeId
where et.Id = 2
4

1 に答える 1

6

WhereおよびAnyメソッドを使用すると、これをかなり簡単に行うことができます。

var results = dbContext.Employees.Where(e => e.EmployeeTypes.Any(et => et.Id == 2));

または、クエリ構文を好む場合:

var results =
    from e in dbContext.Employees
    where e.EmployeeTypes.Any(et => et.Id == 2)
    select e;
于 2013-06-03T22:46:42.817 に答える