2016-05-11 58 views
0

我有這個羣組加入:LINQ的羣組加入與DefaultIfEmpty

var groupjoin = cData.GroupJoin(
      aData, 
      c => c.Id, 
      a => a.Id, 
      (c, joined) => new { c, a = joined.DefaultIfEmpty() }) 
      .ToList(); 

在我的測試數據,沒有匹配。所以,我有這樣的代碼:

  var difference = groupjoin.FirstOrDefault(g => 
      g.a == null); 

我期待difference,使之與作爲目標物從cData一個「C」屬性的匿名對象,而「一」屬性,該屬性爲null。

但是,g.a == null從來就不是真的,所以FirstOrDefault給我一個空的difference。實際上,g.aDefaultIfEmptyIteratorg.a.ToList()給了我1的計數,並且g.a.ToList[0] == null是正確的。

我在這裏做了什麼錯?

+1

如果你使用'Join',你的假設是正確的。 'GroupJoin'是不同的,請參閱下面的答案。 –

回答

3

這就是DefaultIfEmpty的工作原理。如果集合是空的,則此方法返回一個具有一個元素(類型參數的默認值)的集合,而不是null。

所以在你的情況下,如果沒有匹配,joined.DefaultIfEmpty()將返回一個只有一個元素的集合,即null作爲參考類型。

如果你想nulljoined是空的嘗試是這樣的:

joined.Any() ? joined : null 

你可以閱讀更多關於DefaultIfEmptyhere