2016-08-12 5 views
2

で和のグループで3つのテーブルを結合:LINQは - 私はLINQに変換しようとしています次のSQLクエリを持って

Select Employee.Name, 
     ts.HoursWorked, 
     People.Date 
FROM [dbo].[HoursWorked] as Employee 
JOIN (SELECT [Employee], Sum([LaborTime]) as HoursWorked 
     FROM [dbo].[TimeSheet] 
     GROUP BY [Employee]) ts 
ON Employee.Employee = ts.Employee 
JOIN [dbo].[PeopleData] People 
ON Employee.Employee = People.Employee 

を私はしかし、それは期待される結果を返さない以下のことを試してみました:

from ts in _context.TimeSheet 
join es in _context.HoursWorked on ts.Employee equals es.Employee 
join ed in _context.EmployeeDetailed on ts.Employee equals ed.Employee 
group ts by ts.Employee into g 
select new 
{ 
    Name = g.Key, 
    HoursWorked = g.Sum(e => e.LaborTime), 
    FirstDate = ??? //Not sure how to access es 
}; 

答えて

0

いずれかの結合句がサブクエリです。あなたはそれを分ける必要がある物事が少し簡単にするために:

var sub = from ts in _context.TimeSheet 
      group ts by ts.Employee into g 
      select new { 
       Employee = g.Key, 
       HoursWorked = g.Sum(p=>p.LaborTime) 
      }; 

次に、あなたはこのような全体のクエリを行うことができます。

from emp in _context.HoursWorked 
join s in sub on emp.Employee equals s.Employee 
join pd in _context.PeopleData on emp.Employee equals pd.Employee 
select new {emp.Name, s.HoursWorked, emp.FirstDate} 
1

すると、次のクエリを試してみてください。私はjoinsの順序をSQLクエリのように保つように変更しました。あなたの試行で見逃している部分は、ネストされたクエリーに含まれていないので、名前だけではなくグループ化することです(ネストされたクエリーを使わずにSQLを実行しようとする場合にも行う必要があります)

var result = from es in _context.HoursWorked 
      join ts in _context.TimeSheet on es.Employee equals ts.Employee 
      join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee 
      group ts by new { es.Name, ed.Date } into g 
      select new 
      { 
       Name = g.Key.Name, 
       FirstDate = g.Key.Date, 
       HoursWorked = g.Sum(e => e.LaborTime), 
      }; 

あなたがちょうどあなたのSQLのようなクエリを作成したい場合:

var result = from es in _context.HoursWorked 
      join ts in _context.TimeSheet.GroupBy(item => item.Employee) 
           .Select(g => new { Employee = g.Key, HourseWorked = g.Sum(item => item.LaborTime) }) 
      on es.Employee equals ts.Employee 
      join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee 
      select new 
      { 
       Name = es.Employee, 
       HoursWorked = ts.HourseWorked, 
       FirstDate = ed.Date 
      }; 

とクエリ構文では:

var result = from es in _context.HoursWorked 
      join ts in (from item in _context.TimeSheet 
         group item by item.Employee into g 
         select new { Employee = g.Key, HourseWorked = g.Sum(item => item.LaborTime) }) 
      on es.Employee equals ts.Employee 
      join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee 
      select new 
      { 
       Name = es.Employee, 
       HoursWorked = ts.HourseWorked, 
       FirstDate = ed.Date 
      }; 
0

LINQクエリのすべてのローカル変数が後に達成できませんグループ範囲変数。あなたはそれが宣言されているとして(ed.Date)変数EDにアクセスすることはできませんので、このコードは動作します

group ts by ts.Employee into g 

前:

var result = ts in _context.TimeSheet 
     group ts by ts.Employee into g 
     let singleG = g.FirstOrDefault() 
     join es in _context.HoursWorked on singleG.Employee equals es.Employee 
     join ed in _context.PeopleData on es.Employee equals ed.Employee 
     select new 
     { 
      Name = g.Key, 
      HoursWorked = g.Sum(e => e.LaborTime), 
      FirstDate = ed.Date 
     }; 
関連する問題