GroupJoin返回的Sequence不包含任何元素

时间:2019-02-27 21:01:47

标签: c# linq

我有这2个列表list1和list2,并创建了此GroupJoin:

List1是人员(标识,名称)列表,list2是对象(标识,汽车,日期)列表。

PS:list1包含大约40个元素,而list2目前仅包含一个元素。

我尝试设置maxDate,但出现错误“序列不包含任何元素”

var result = list1.GroupJoin(list2, 
                l1 => l1.Id,
                l2 => l2.Id
                (a, b) => new
                {
                    listA = a,
                    maxDate = b?.Max(m => m.Date).Date ??
                        new DateTime(2000, 01, 01)
                                 }).ToList();

1 个答案:

答案 0 :(得分:3)

查看表达式b?.Max,看起来您期望没有内部匹配的变量b将代表null,该变量代表内部列表的相关元素。

但是GroupJoin文档明确指出:

  

如果innerouter中没有相关元素,则该元素的匹配顺序将为,但仍会出现在结果中。

因此,b永远不会null,并且Max在为空时会引发有问题的异常。

您可以通过两种方式解决它。

首先是使用Max的可为空的重载,该重载返回null而不是在空序列上引发异常:

maxDate = b.Max(m => (DateTime?)m.Date.Date) ?? new DateTime(2000, 01, 01)

这对于EnumerableQueryable的实现都很好。

仅适用于Enumerable的第二种方法是使用SelectDefaultIfEmptyMax的组合:

maxDate = b.Select(m => m.Date.Date).DefaultIfEmpty(new DateTime(2000, 01, 01)).Max()