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

时间:2013-06-03 22:43:32

标签: c# sql linq 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

使用“从数据库更新模型”将这些表引入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

1 个答案:

答案 0 :(得分: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;