2016-08-12 1 views
2

I가 내가 LINQ로 번역하려고 다음 SQL 쿼리 : 나는 예상 된 결과를 반환하지 않습니다 그러나 다음 시도했습니다LINQ는 -에 의해 그룹 3 개 테이블을 가입하고 요약

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) 변수 에디션에 액세스 할 수 있도록이 코드가 작동합니다

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 
     };