2017-09-27 3 views
1

다음 SQL을 EF 쿼리에 매핑하고 싶습니다. 비슷한 주제를 찾았지만 여전히 매핑을 수행하지 못했습니다. {0} ... {2}은 (는) SQL 매개 변수입니다.JOIN, GROUP BY 및 SUM이있는 SQL과 Entity Framework 쿼리를 매핑하십시오.

SELECT TaskGroup.Project AS Project 
SUM(Datediff(minute, WorkLog.StartTime, WorkLog.EndTime))/60 AS Hours 
FROM WorkLog INNER JOIN TaskDefinition ON WorkLog.TaskDefinitionID = TaskDefinition.ID 
INNER JOIN TaskGroup ON TaskDefinition.TaskGroupID = TaskGroup.ID 
WHERE WorkLog.EmployeeID = {0} AND WorkLog.Status = 5 AND 
    WorkLog.StartTime >= {1} AND WorkLog.EndTime < {2} 
GROUP BY TaskGroup.Project 

답변

0

var query = (from wl in WorkLog 
      join td in TaskDefinition on wl.TaskDefinitionID equals td.ID 
      join tg in TaskGroup on td.TaskGroupID equals tg.ID 
      where wl.EmployeeID == { 0} && wl.Status == 5 
       && wl.StartTime >= { 1} && wl.EndTime < { 2} 
      select new 
      { 
       Project = tg.Project, 
       StartTime = wl.StartTime, 
       EndTime = wl.EndTime 
      }) 
      .GroupBy(o => o.Project) 
      .Select(g => new 
      { 
       Project = g.Key, 
       Hours = g.Sum(o => (o.EndTime - o.StartTime).Minutes)/60 
      }); 
+0

해결되지 않았지만 다음 사항에 유의하십시오. GROUP BY는 DB 서버에서 실행되지 않고 대신 localy를 수행합니다. 즉, 관련 테이블의 모든 데이터 행을 서버에서 검색해야합니다. 대형 테이블의 경우 엄청난 성능 손실이 발생합니다. .NET Core 2는 효율적인 GROUP BY 쿼리를 아직 만들 수 없습니다. – Marko

+0

정말입니까? 나는 단지 비슷한 쿼리 (join, select, group by and select)를 테스트했고'context.Database.Log = s => System.Diagnostics.Debug.Write (s);를 사용했다. SQL Server에서 실행되며이 쿼리는 그룹을 실행합니다 (EF 코어를 사용하고 있지 않습니다 .Net Framework 4.6.1에서 EF 6.1.3을 사용하고 있습니다) –

+0

로컬 그룹을 설정하면 EF 코어로 예 (경고 대신에) 예외를 던지기 위해, 그것은 일어난다. – Marko

관련 문제