2017-09-27 164 views
1

我想將以下SQL映射到EF查詢。我發現了一些類似的主題,但仍未能實現映射。 {0} ... {2}是SQL參數。將SQL與JOIN,GROUP BY和SUM映射到實體框架查詢

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將不會在數據庫服務器上執行,而是在本地執行。這意味着必須從服務器檢索所有相關的數據行,對於大型表而言,這是一個巨大的性能損失。看來,.NET Core 2還不能創建高效的GROUP BY查詢。 – Marko

+0

你確定嗎?我剛剛測試了一個類似的查詢(加入,選擇,分組和選擇)並使用'context.Database.Log = s => System.Diagnostics.Debug.Write(s);'我注意到只有一個查詢在SQL Server中執行,並且此查詢正在執行組(由於我沒有使用EF Core,我在.Net Framework 4.6.1中使用EF 6.1.3) –

+0

是的,使用EF核心,如果您設置本地分組拋出異常(而不是警告),它確實發生。 – Marko