Linq GroupJoin与DefaultIfEmpty

时间:2016-05-11 13:03:37

标签: c# linq

我有这个GroupJoin:

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成为一个带有" c"的匿名对象。属于cData的对象的属性,以及" a"属性为null。

但是,g.a == null永远不会成立,因此FirstOrDefault会为difference提供空值。事实上,g.aDefaultIfEmptyIterator,而g.a.ToList()的计数为1,g.a.ToList[0] == null为真。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

DefaultIfEmpty的工作原理。如果集合为空,则此方法返回具有一个元素(类型参数的默认值)的集合。

因此,在您的情况下,如果没有匹配项,joined.DefaultIfEmpty()将返回仅包含一个元素的集合,即null作为参考类型。

如果您希望nulljoined时为空,请尝试以下操作:

joined.Any() ? joined : null

您可以详细了解DefaultIfEmpty here