需要将此子查询更改为连接? (LINQ / T-SQL / EF)

时间:2013-06-28 12:37:51

标签: sql linq entity-framework

所以我有一个EmployeeScheduleRoles表,包含ID,EmployeeID,ScheduleID,RoleID

作为注释,RoleID == 1表示您是该计划的管理员(经理)。 我将经理的ID硬编码为15921

现在,我抓住经理有权管理的时间表

var schedList1 = (
  from esr in dbcontext.EmployeeScheduleRoles
  where esr.EmployeeID == 15921 && esr.RoleID == 1
  select esr);

从这里,我抓住这些日程表中的所有员工

var EmployeeScheduleRoles =
  (from esr in dbcontext.EmployeeScheduleRoles
  join s in schedList1 on esr.ScheduleID equals s.ScheduleID
  select esr)

我希望我可以推迟第一个并让它执行第二个。它这样做,但它作为子查询“单独”运行。

我已经尝试过做一些内部联接,但是我迷路了。

期望的输出:

EmployeeID  ScheduleID  RoleID
15921       1241        1
15927       1241        2
15948       1241        2
15949       1241        2
15950       1241        2
15951       1241        2
15952       1241        2
15953       1241        2
15954       1241        2
15955       1241        2
15956       1241        2
15957       1241        2
15958       1241        2
15959       1241        2
15960       1241        2
15961       1241        2
15962       1241        2
17822       1241        2
18026       1241        2
18027       1241        2
18028       1241        2

在这种特殊情况下,请注意此帐户只有一个时间表(在经理的管辖范围内)

编辑:我想彻底摆脱'schedList1'并将其替换为连接。

以下功能正常,但我想在可能的情况下强制执行此操作,而不是主查询和子查询。

from esr in dbcontext.EmployeeScheduleRoles
join s in
  (from esr in dbcontext.EmployeeScheduleRoles
  where esr.EmployeeID == 15921 && esr.RoleID == 1
  select esr.ScheduleID)
on esr.ScheduleID equals s
select esr)

1 个答案:

答案 0 :(得分:1)

听起来你想要这样的东西:

var EmployeeScheduleRoles =
  from esrManager in dbcontext.EmployeeScheduleRoles
  join esrEmployee in dbContext.EmployeeScheduleRoles on esrEmployee.ScheduleID equals esrManager.ScheduleID
  where esrManager.EmployeeID == 15921 && esrManager.RoleID == 1
  select new 
  {
     esrEmployee.EmployeeID,
     esrEmployee.ScheduleID,
     esrEmployee.RoleID
  };

您将与其共享相同scheduleId的员工加入经理,因此EmployeeSchduleRoles的出现次数为两次。