2012-12-07 45 views
3

我有一個僱員表:如何添加左外連接到分組並總結LINQ查詢

EmployeeID | EmployeeName 
--------------------------- 
1   | Jack 
2   | Jill 
3   | Roger 

而且一出現表:

OccurrenceID | EmployeeID | Points 
-------------------------------------- 
1    | 1   | 5 
2    | 2   | 3 
3    | 1   | 1 

我有一個工作LINQ查詢組,總和兩個表一起:

groupedOccurrences = (from o in db.Occurrences.Include(o => o.Employee) 
         where o.OccurrenceDate >= beginDate 
         && o.OccurrenceDate <= endDate 
         group o by o.Employee.EmployeeName into g 
         select new OccurrenceByQuarter 
         { 
          Name = g.Key, 
          Total = g.Sum(o => o.Points) 
         }); 

哪個產生這樣的輸出:

Jack 6 
Jill 3 

但是我想讓員工羅傑在0分的輸出中顯示出來。我試着加入加盟LINQ查詢是這樣的:

groupedOccurrences = (from e in db.Employees 
         from o in db.Occurrences 
         join o in db.Occurrences on e.EmployeeID equals o.EmployeeID into j1 
         from j2 in j1.DefaultIfEmpty() 
         group j2 by e.EmployeeName into g 
         select new OccurrenceByQuarter 
         { 
          Name = g.Key, 
          Total = g.Sum(o => o.Points) 
         }); 

但我最終點是極大膨脹(如24倍,他們應該怎麼定)的數量。

我也試圖讓達爾如果爲null,通過改變總的聲明,我OccurrencesByQuarter類返回0到public int? Total { get; set; }但後來當我試圖改變LINQ查詢到包括Total = g.Sum(o => o.Points) ?? 0我得到一個錯誤,指出「運算符不能應用於int和int類型的操作數「。

任何幫助將不勝感激。

回答

6

使用組加入:

groupedOccurrences = (from e in db.Employees 
         join o in db.Occurrences.Where(x => 
            x.OccurrenceDate >= beginDate && 
            x.OccurrenceDate <= endDate) 
          on e.EmployeeID equals o.EmployeeID into g 
         select new OccurrenceByQuarter 
         { 
          Name = e.EmployeeName, 
          Total = g.Sum(x => (int?)x.Points) ?? 0 
         }); 

結果將是:

Jack 6 
Jill 3 
Roger 0 

爲了回報0空組投總結屬性爲空,然後應用空合併運算符返回默認值:g.Sum(x => (int?)x.Points) ?? 0

+1

那很美。謝謝! – Splendor

+0

太棒了! 「into g」使linq語句實際上成爲一個外連接,如果省略了into子句,它只是執行正常的連接,只有匹配的行纔會被檢索。並且會有員工x發生這些事情,而不是這裏產生的好團體 –