2013-03-01 40 views
0

我想要連接兩個查詢。在這第一個查詢將包含4條記錄和第二個查詢將包含0或更多的記錄多達4.我想加入這兩個,並希望得到4條記錄。如果在第二個查詢中有任何記錄,那麼我想從第二個表獲得許可。我寫過類似的代碼。如何在linq中左連接兩個查詢

var finalquery = values.GroupJoin(records, i => i.typeid, j => j.typeid, (i, j) => new { i, j }).SelectMany(i => i.j.DefaultIfEmpty(), (i, j) => new { 
      id = i.i.typeid, 
      Permission = (j.premission ==null)?null:j.premission 

     }).ToArray(); 

但它拋出一個異常

+0

有什麼異常? – GrandMasterFlush 2013-03-01 10:06:29

+0

@GrandMasterFlush空引用異常 – Pa1 2013-03-01 10:07:42

回答

0

你的NullReferenceException在此條件下:

j.premission ==null 

這將引發當j是null(默認情況下)。

var finalquery = values.GroupJoin(records, 
            v => v.typeid, 
            r => r.typeid, 
           (v, g) => new { v, g }) 
         .SelectMany(x => x.g.DefaultIfEmpty(), 
            (x, r) => new { 
            id = x.v.typeid, 
            Permission = r == null ? null : r.permission 
            }) 
         .ToArray(); 

或者與查詢語法(轉換成數組省略美):

var finalquery = 
    from v in values 
    join r in records on v.typeid equals r.typeid into g 
    from r in g.DefaultIfEmpty() 
    select new { 
     id = v.typeid, 
     Permission = r == null ? null : r.permission 
    }; 
+0

我試過你的代碼,但我得到了同樣的異常。我的代碼和你的代碼有什麼區別。對不起,我的語言 – Pa1 2013-03-01 10:30:21

+0

@ Pa1好吧,最初在代碼中沒有默認值檢查,並且您的代碼對範圍變量命名不當。 'i'是一個匿名對象,'i'是該對象的一個​​屬性,'i'是一個來自值的值。順便說一句,我的代碼與MS SQL工作正常 – 2013-03-01 10:33:46

+0

@ Pa1我發現區別!當j默認爲'j.premission == null'時,你有例外 – 2013-03-01 10:36:09