2016-05-11 34 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