Search code examples
entity-frameworklinqgroup-bylinq-to-entities

Map SQL with JOIN, GROUP BY, and SUM to Entity Framework query


I'd like to map the following SQL to EF query. I found a few similar topics, but still failed to achieve the mapping. {0}...{2} are SQL parameters.

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

Solution

  • What about this?

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