2013-06-03 83 views
3

我需要幫助篩選實體框架(EF)導航 屬性上的LINQ查詢。表格是首先創建的(不是代碼優先)。需要幫助使用實體框架篩選LINQ查詢導航屬性

對於這個問題,我們使用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 

這些表被帶入使用「更新模型從數據庫」 EF 功能在Visual Studio中。

所有實體的名稱都與表名完全相同,實體集是 複數形式。

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 

回答

6

您可以用WhereAny方法做到這一點很容易:

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;