LINQ 字符串比较与 NULL 处理
LINQ String comparison with NULL handling
我正在使用这样的 LINQ 表达式
Attention attention = debtor_response.DebtorEntry
.Address.AttentionList.Where(p => p.JobTitle.ToLower() == "valuetocheck")
.FirstOrDefault();
这在正常情况下确实有效。但在某些情况下它 returns 是一个例外
Value cannot be null.\r\nParameter name: source
我认为可能的原因是
JobTitle 在某些情况下可能为空
那么我怎样才能在上面的 LINQ 中正确处理这个问题并摆脱异常
我怀疑 AttentionList
为空,因为 method signature for Enumerable.Where
是:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source, <-------
Func<TSource, bool> predicate
)
您的错误表明名为 source
的参数为空,这与 this extension method throws:
匹配
Exception: ArgumentNullException
Condition: source or predicate is 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
首先被调用,并且不能 return 为 FirstOrDefault
的空值。所以罪魁祸首一定是Enumerable.Where
。它的source
参数为空,那个参数是AttentionList
.
我正在使用这样的 LINQ 表达式
Attention attention = debtor_response.DebtorEntry
.Address.AttentionList.Where(p => p.JobTitle.ToLower() == "valuetocheck")
.FirstOrDefault();
这在正常情况下确实有效。但在某些情况下它 returns 是一个例外
Value cannot be null.\r\nParameter name: source
我认为可能的原因是
JobTitle 在某些情况下可能为空
那么我怎样才能在上面的 LINQ 中正确处理这个问题并摆脱异常
我怀疑 AttentionList
为空,因为 method signature for Enumerable.Where
是:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source, <-------
Func<TSource, bool> predicate
)
您的错误表明名为 source
的参数为空,这与 this extension method throws:
Exception: ArgumentNullException
Condition: source or predicate is 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
首先被调用,并且不能 return 为 FirstOrDefault
的空值。所以罪魁祸首一定是Enumerable.Where
。它的source
参数为空,那个参数是AttentionList
.