具有多个表条件的EF查询

时间:2010-11-29 20:54:25

标签: c# entity-framework .net-4.0 entity-framework-4

我有一个名为“Employees”的表。此表中的employeeId可能位于名为“Tasks”的另一个表(多对多连接tbale)中。 “任务”表中的另一个字段是链接到“TaskDetails”表的taskId。此表包含budgetHours等详细信息。

使用EF4,如何编写WHERE语句,使得返回是分配给budgetHours为>的任务的员工。 120小时?

以下WHERE语句限制了Employees表中的行,但现在我需要在TaskDetails表中添加条件。

var assocOrg = Employees.Where(x => x.EmployeeTypeID == 2 && x.DepartmentName == "ABC").Select (x => x.EmployeeID);

谢谢!

3 个答案:

答案 0 :(得分:4)

如果Employees有一个名为Tasks的导航属性,请尝试:

var assocOrg = Employees.Where(x => x.EmployeeTypeID == 2 && 
                                    x.DepartmentName == "ABC" &&
                                    x.Tasks.Any(t => t.BudgetHours > 120))
                        .Select (x => x.EmployeeID);

答案 1 :(得分:1)

如果表结构如下,

TableName            Employee  Task               TaskDetails
ReferenceKeys        EmpID     EmpdID/TaskID      TaskID/BudgetHours

然后使用,

Employee.Where(x => x.Task.EmpID == x.EmpID && x.Task.TaskDetails.TaskID == x.Task.TaskID && x.Task.TaskDetails.BudgetHours > 120).select(x => x.EmpID)

答案 2 :(得分:0)

假设Tasks实体上有Employee导航属性,这应该很简单:

var assocOrg = Employees.Where(x => x.Tasks.Any(t => t.BudgetHours > 120) && x.DepartmentName == "ABC").Select (x => x.EmployeeID);

当然,这需要在此时明确地,通过延迟加载或使用.Include()来解析Tasks属性。

(感谢@adrift让Tasks.Any()正确......哎呀。)