需要帮助使用实体框架导航属性过滤LINQ查询

Hal*_*yon 3 c# sql linq entity-framework

我需要帮助过滤实体框架(EF)导航属性上的LINQ查询.首先创建表(不是代码优先).

对于这个问题,让我们使用Office中的字符.

假设我有以下表格和列:

Offices
    Id
    Name
    Location

Employees
    Id
    Name

EmployeeTypes
    Id
    Description

Employees_EmployeeTypes
    Id
    EmployeeId
    EmployeeTypeId
Run Code Online (Sandbox Code Playgroud)

表格包含以下数据:

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
Run Code Online (Sandbox Code Playgroud)

使用Visual Studio中的"从数据库更新模型"功能将这些表引入EF.

所有实体的名称与表名完全相同,实体集也是多元化的.

Entity Name     Entity Set Name
Office          Offices
Employee        Employees
EmployeeType    EmployeeTypes
Run Code Online (Sandbox Code Playgroud)

Employees_EmployeeTypes表是一个联结表(多对多),将转换为EF中的导航属性,并命名为"EmployeeTypes".以下是其用法示例:

var employeeTypes = dbContext.Employees.Find(1).EmployeeTypes;
Run Code Online (Sandbox Code Playgroud)

现在我们有了设置,让我们来看看问题.使用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
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 6

您可以使用WhereAny方法相当容易地完成此操作:

var results = dbContext.Employees.Where(e => e.EmployeeTypes.Any(et => et.Id == 2));
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢查询语法:

var results =
    from e in dbContext.Employees
    where e.EmployeeTypes.Any(et => et.Id == 2)
    select e;
Run Code Online (Sandbox Code Playgroud)