2017-06-12 7 views
0

各作業区で作成されたウィジェットの数を1時間間隔で表示するためのプロダクションダッシュボードを作成しています。ウィジェットの作成には、1時間ごとに「トリガー」と「ターゲット」の値があります。私のクエリは機能します...しかし、その時間にウィジェットが作成されていない場合、特定のインターバル時間は表示されません。私は可能なすべての間隔をキャプチャするためにインターバルターゲットテーブル上で一種の左外部結合をしようとしていますが、ゼロウィジェットカウントを持つ間隔を表示できませんでした。LINQはcount - multipleテーブル結合で左結合しました。Visual Studio 2015 MVC 5 C#

dbvm.widgetSummary = from wc in db.workCenters 
        from w in db.widgets.Where(w => w.createdByID == wc.ID && w.packDate >= beginDate && w.packDate <= endDate) 
        from d in db.departments.Where(d => d.ID == wc.deptID && wc.display == true) 
        from g in db.goals.Where(g => g.workCenterID == wc.ID && g.hour == w.packDate.Value.Hour) 
        group g by new { wc.ID, wc.friendlyName, g.hour, g.trigger, g.target, d.dept } into n 
        select new WidgetSummary() 
        { 
         createdByID = n.Key.ID, 
         friendlyName = n.Key.friendlyName, 
         hour = n.Key.hour, 
         actualWidgets = n.Count(), 
         triggerWidgets = n.Key.trigger, 
         targetWidgets = n.Key.target, 
         variance = (n.Count() - n.Key.target), 
         dept = n.Key.dept 

        }; 

return View(dbvm); 
+0

というクエリを使用してください。この複雑なクエリでは、EFまたはLinq-To-SQLを実行しようとするよりも、まっすぐなSQLを使用することを推奨します。 – Cameron

+0

これは私の内部結合のように見えます。私は通常、DefaultIfEmpty'が残っているのを見ています。 –

+0

ありがとうございます - 私はDefaultIfEmpty()のいくつかの組み合わせを試しましたが、目的の結果を得たバージョンはありませんでした。 – scootsch

答えて

0

いいえ、あなたはleft outer joinを行うことができます。

from wc in db.workCenters 
join jw in db.widgets.Where(w => w.packDate >= beginDate && w.packDate <= endDate) on wc.ID equals jw.createdByID into wgj 
from w in wgj.DefaultIfEmpty() ... 

しかし、なぜ、あなたはwc.Widgetswc.Departmentswc.Goalsを持っていません。 Seamは私のドメインモデルはすべてのオブジェクト指向ではなく、あなたは関係なくフラットテーブルを使用しています。 また、EFを使用している場合は、perf optimization

関連する問題