2011-03-30 124 views
16

如何使用點符號在linq中執行左外連接?Linq - 帶點符號的左外連接

這裏的查詢表達式:

var query = from u in db.Users 
      join d in db.Defects on u.userID equals d.userID into defectsGroup 
      from d in defectsGroup.DefaultIfEmpty() 
      select new { u, d }; 

這裏是我的嘗試:

var query2 = db.Users.GroupJoin(db.Defects.DefaultIfEmpty(), 
       u => u.userID, 
       d => d.userID, 
       (user, defect) => new { user, defect }); 

但缺陷是顯示爲IEnumerable<Defect>而不僅僅是Defect。我也試過:

var query2 = db.Users.GroupJoin(db.Defects, 
       u => u.userID, 
       d => d.userID, 
       (user, defect) => new { user, defect.DefaultIfEmpty() }); 

哪個根本不會編譯。所有在線示例似乎都使用(更清晰)查詢語法。

回答

22

我想你想要這樣的:

var query2 = db.Users.GroupJoin(db.Defects, 
           u => u.userId, 
           d => d.userID, 
           (u, defectsGroup) => new { u, defectsGroup}) 
        .SelectMany(z => z.defectsGroup.DefaultIfEmpty(), 
           (z, d) => new { z.u, d }); 

見我Edulinq blog post on query expressions瞭解更多詳情。

+2

哇 - 我想這就是爲什麼所有的樣品使用的是:) – 2011-03-30 14:54:07

+0

@Adam查詢語法:是的,連接是在查詢語法,而更簡單的:) – 2011-03-30 15:32:11

+0

所有我能找到微軟DefaultIfEmpty的文件說(和實例當給定的枚舉爲空時,它返回一個默認項目的枚舉。左外部連接示例都顯示它在枚舉中的PARTICULAR項爲null時返回默認項。我發現這很有效,但是這個特別的(明顯不同的)方法的文檔在哪裏?謝謝! – 2011-04-26 14:48:59