我有一个名为“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);
谢谢!
答案 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()正确......哎呀。)