2017-09-27 118 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