2010-03-04 93 views
0

我們有兩個表 - 任務和任務用戶(分配給任務的用戶)。任務具有稱爲TaskUsers的EntityCollection。Linq to entities - 如何定義左連接進行分組?

該查詢返回每名任務數:

model.TaskCountByAssignee = 
      (
      from t in TaskRepository.List() 
      from tu in t.TaskUsers 
      group tu by tu into tug 
       select new {Count = tug.Count(), UserName = tug.Key.Username}).ToList() 

該查詢返回:

管理員11
LukLed 5

我想它返回:

管理員11
LukLed 5
null 10

一些任務沒有任何分配,但我仍然希望將它們放在我的結果集中。通常,在SQL中,它通過將join更改爲left join來實現。在EF之外的Linq中,我可以使用DefaultIfEmpty()。如何在LINQ中對實體進行處理?

+0

@LukLed - 我刪除了我的答案,因爲它沒有幫助。對不起... – David 2010-03-04 04:45:29

+0

你確定你不能使用DefaultIfEmpty()嗎?請參閱http://msdn.microsoft.com/en-us/vcsharp/ee908647.aspx#leftouterjoin – Foole 2010-03-04 07:32:41

+0

@Fole:我寫道,我可以使用它,如果它不是EntityFramework,但DefaultIfEmpty不適用於EF。 – LukLed 2010-03-04 07:36:50

回答

2

我的第一次嘗試是:

model.TaskCountByAssignee = (
     (from t in TaskRepository.List() 
     from tu in t.TaskUsers 
     group tu by tu.UserName into tug 
     select new {Count = tug.Count(), UserName = tug.Key}) 
     .Union(from t in TaskRepository.List() 
       where !t.TaskUsers.Any() 
       group t by 1 into tug 
       select new {Count = tug.Count(), UserName = null}).ToList(); 

或者類似的規定。或者只是使用兩個查詢。不過,我不知道這是否是最好的方法。正如我在評論中指出,這是在EF 4更容易。

0

我會建議在這裏尋找其經過左外連接與EF:

http://geekswithblogs.net/SudheersBlog/archive/2009/06/11/132758.aspx

+0

謝謝,但它如何適用於我的問題? – LukLed 2010-03-05 06:20:25

+0

就在下面他解釋了以這種方式無法完成連接的情況,因爲上面說過在EF 4中更容易這樣做,所以我們不得不求助於SP來在這之前完成一些連接。 – 2010-03-05 09:12:35

+0

他在哪裏解釋這是不可能的? – LukLed 2010-03-05 17:06:48