我正在使用这样的LINQ表达式
Attention attention = debtor_response.DebtorEntry
.Address.AttentionList.Where(p => p.JobTitle.ToLower() == "valuetocheck")
.FirstOrDefault();
这在正常情况下确实有效。但在某些情况下,它会返回异常
Value cannot be null.\r\nParameter name: source
我想到的可能原因是
在某些情况下,JobTitle可能为null
那么如何才能在上面的LINQ中正确处理这个问题并摆脱异常
答案 0 :(得分:6)
我怀疑AttentionList
为空,因为method signature for Enumerable.Where
是:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source, <-------
Func<TSource, bool> predicate
)
您的错误表示名为source
的参数为null,与this extension method throws匹配:
异常:ArgumentNullException
条件:source或predicate为null。
尝试将代码更改为以下内容:
Attention attention = debtor_response.DebtorEntry
.Address
.AttentionList?.Where(p => p.JobTitle.ToLower() == "valuetocheck")
// ↑
.FirstOrDefault();
注意第3行添加了?
?如果AttentionList
为空,Null-conditional Operator将无法调用Where
我是如何得出这个结论的
你得到一个ArgumentNullException
,但你只有三个函数调用:
Enumerable.Where (extension)
Enumerable.FirstOrDefault (extension)
String.ToLower
ToLower
没有任何参数,因此可以排除它。如果JobTitle
为空,您将获得NullReferenceException
。
两种扩展方法都有一个名为source
的参数。但是,Where
首先被调用,并且不能将空值返回给FirstOrDefault
。所以罪魁祸首必须是Enumerable.Where
。它的source
参数为null,该参数为AttentionList
。