根据同一问题给出的答案:How to check IEnumerable<DataRow> returns null or has any row?以及我发现的大部分谷歌搜索结果,您可以使用.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
答案 0 :(得分:5)
问题不在于Any()
是问题所在。您的问题是,您尝试在查询中访问的字段很可能会返回null
。
我会检查navData不是null
而表格不是null
而Tables[0]
不是空的。 Any()使用延迟执行,因此当您分配查询时,它不一定会被请求处理,直到请求它为止,这恰好是在调用Any()
时。因此,在实际迭代之前,查询的任何问题都不会显现出来。