如何检查空的IEnumerable <datarow>集合?</datarow>

时间:2011-09-19 17:49:07

标签: c# linq

根据同一问题给出的答案: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

1 个答案:

答案 0 :(得分:5)

问题不在于Any()是问题所在。您的问题是,您尝试在查询中访问的字段很可能会返回null

我会检查navData不是null而表格不是nullTables[0]不是空的。 Any()使用延迟执行,因此当您分配查询时,它不一定会被请求处理,直到请求它为止,这恰好是在调用Any()时。因此,在实际迭代之前,查询的任何问题都不会显现出来。