如何检查一个空的IEnumerable<DataRow>集合?

3
根据同一个问题的答案:如何检查IEnumerable<DataRow>返回null或是否有任何行?以及我找到的大部分谷歌搜索结果,您应该使用.Any()来验证集合至少包含一个项目。然而,在以下代码中,.Any()抛出了“对象引用未设置为对象的实例”的异常。请问有人能指出我做错了什么吗?
DataSet navData = GetNavigationData();
bool linkFound = false;

if(!CommonLibrary.IsDataSetEmpty(navData))
{
  IEnumerable<DataRow> foundLinks = from link in navData.Tables[0].AsEnumerable()
                                    where link.Field<string>("URL").ToLower() == searchURL
                                    select link;

  linkFound = (foundLinks.Any());
}

相关的堆栈跟踪显示异常来自于 Any() 调用:

at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at MyMethod in MySource.cs:line 259

2
出于好奇,为什么在 Any() 调用周围加上括号? - BoltClock
3
@bolt: 布尔巫术。它实际上是 (false != x.Any()) 的缩写。 - H H
1
异常的类型是什么? - Rune FS
完整的堆栈跟踪也可能很有趣。 - H H
1个回答

5
您的问题并不在于 Any() 是问题所在,而是您尝试访问的查询字段很可能返回了 null
我建议检查 navData 和 Tables 是否为null,以及 Tables[0] 是否为null。Any() 使用延迟执行,因此当您分配查询时,它不一定会被处理,直到被请求时才会处理,这恰好发生在调用 Any() 时。因此,任何与查询相关的问题都将在实际迭代之前无法体现。

是的,请从头开始。我不排除ConnectionString问题的可能性。 - H H
好的,为什么要踩我呢?如果你要踩我,至少说一下原因。 - James Michael Hare
@Henk:为什么会这样,大家都跑哪去了? - James Michael Hare
1
有两个答案声称“link”可能为空,但实际上不可能。 - H H
我已经将此标记为答案,因为它帮助我确定了空异常来自何处。最终罪魁祸首是.ToLower()调用,我最初在示例代码中遗漏了它。基本上,将where子句更改为以下内容可消除异常;尽管我不喜欢两次获取字段值:Swhere (!String.IsNullOrEmpty(link.Field<string>("URL")) && link.Field<string>("URL").ToLower() == searchURL) - wdspider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接