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

3

我需要帮助在Entity Framework(EF)导航属性上过滤LINQ查询。表是先创建的(不是代码优先)。

针对这个问题,我们使用《办公室》中的角色。

假设我有以下表和列:

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
1个回答

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接