1

Employee、Manager、Branch、Division、Employee_historyのような類似したテーブルがあります

そして、2つのテーブルEmployeeとManagerがemployee_id、name、branch_idなどの特定の列を共有するとします。

ブランチテーブルにはbranch_idがあります

除算テーブルにはdivision_idがあります

Employee_historyにはemp_hist_idがあります。これらのテーブルはすべて1対多の関係です

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では、ブランチテーブルの前に2つまたは3つの結合があり、ユニオンの後に1つの結合があります

そして私の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句の式の1つの型が正しくありません。'Join'の呼び出しで型推論が失敗しました。

'join empl in('で始まる行

4

2 に答える 2

0

oncaluse の構文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()は、プロパティ名とタイプ (!) が等しいことを確認してください。intに を単純に結合することはできません。 もint?キャストするint必要がint?あります。

以下の例では、Branch_IDonEmployeeManagerare nullable ( 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 に答える