1

我有类似 Employee、Manager、Branch、Division、Employee_history 的表

让我们说两个表 Employee 和 Manager 共享某些列,例如employee_id、name、branch_id

分支表有 branch_id

分区表有 division_id

Employee_history 有 emp_hist_id。所有这些表都是一对多的关系

我要转换为 LINQ 的 SQL 是

select b.branch_id, e.employee_id 
from division d
join branch b on d.division_id = b.division_id
join 
      (   select employee_id, branch_id
          from EMPLOYEE 
          UNION 
          select employee_id, branch_id
          from MANAGER
       ) e
on e.branch_id = b.branch_id
join EMPLOYEE_HISTORY eh on eh.employee_id = e.employee_id

我如何做一个 UNION 然后加入。我已经放了一个简化版本的 SQL,而不是我所拥有的。在我的实际SQL中,Branch表之前有两三个join,union之后有一个join

我的 LINQ 看起来像(类似于实际代码)

  from division in divisions
  join brnch in Branch on division.division_id equals brnch.division_id
  join empl in (
        from emplyee in Employee select new { EmployeeId = emplyee.employee_id},  BrnachId = branch_id).Union(
        from mngr in Manager select new { EmployeeId = mngr.employee_id, BrnachId = branch_id)
   on brnch.branch_id equals empl.BranchId
  join emplhistory in EMPLOYEE_HISTORY on empl.EmployeeId equals emplhistory.employee_id
  where division.division_type_id = 10
  select new
  {
     //...
  }

我收到错误消息:

join 子句中的表达式之一的类型不正确。对“加入”的调用中的类型推断失败。

在以 'join empl in (' 开头的行中

4

2 回答 2

0

您的oncaluse of语法Join略有偏差。在 C# 中它不是:

on division.division_id = brnch.division_id

它必须是:

on division.division_id equals brnch.division_id

这需要对所有on条款进行更改。

于 2013-01-30T19:18:45.933 回答
0

LINQ语句的顺序有点颠倒,而不是SQL. 并确保.Join()属性名称和类型(!)是相等的。您不能简单地加入 an inton an int?,您还必须转换intto be int?

在下面的示例中,我假设Branch_IDonEmployee并且Manager可以为空 ( int?)。

DataContext.GetTable<Employee>()
    .Select(e => new { e.ID, e.Name, e.Branch_ID })
    .Union(DataContext.GetTable<Manager>()
            .Select(m => new { m.ID, m.Name, m.Branch_ID }))
    .Join(DataContext.GetTable<Branch>(), 
            u => new { Branch_ID = u.Branch_ID },
            b => new { Branch_ID = (int?)b.ID },
            (u, b) => new { u.ID, u.Name, u.Branch_ID, b.Branch_Name })
    .Select(j => new { j.ID, j.Name, j.Branch_ID, j.Branch_Name });

为了完成它,我将其应用于实际代码:

divisions
    .Where(d => d.division_type_id == 10)
    .Join(branches, 
          d => (int?)d.division_id, 
          b => b.division_id, 
          (d, b) => new { b.branch_id }) // j1
    .Join(employees
            .Select(e => new { e.employee_id, e.branch_id })
            .Union(managers
                     .Select(m => new { m.employee_id, m.branch_id })),
          j1 => (int?)j1.branch_id,
          em => em.branch_id,
          (j1, em) => new { em.employee_id, em.branch_id }) // j2
    .Join(employeeHistory,
          j2 => j2.employee_id,
          h => h.employee_id,
          (j2, h) => new { j2.employee_id, j2.branch_id, h.history_line }) // j3
于 2013-01-30T19:17:31.540 回答