2017-06-12 88 views
0

我創建一個生產儀表板以顯示每個工作中心產生的小部件的數量,間隔爲一小時。在每個小時的過程中,小部件製作都有「觸發器」和「目標」值。我的查詢工作正常......但是如果在那個小時內沒有生成小部件,它不會顯示特定的時間間隔。我試圖在間隔目標表上執行一種左外連接來捕獲所有可能的時間間隔,但一直未能顯示具有零小部件計數的間隔。LINQ左連接count - 多表連接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

有了這個複雜的查詢,我會主張使用直接sql而不是嘗試執行EF或Linq-To-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。對我來說,你的領域模型並不是面向對象的,你只是使用沒有關係的平坦表。 另外,如果您使用的是EF,您可能需要查看perf optimization