2017-09-27 20 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、select)し、 'context.Database.Log = s => System.Diagnostics.Debug.Write(s);' SQL Serverで実行され、このクエリはグループを実行しています(私はEF Coreを使用していません、.NET Framework 4.6.1でEF 6.1.3を使用しています) –

+0

ローカルグループを設定すると、 (警告の代わりに)例外をスローするには、それは起こります。 – Marko

関連する問題