你调用的对象是空的。但foreach循环正在工作

时间:2016-02-17 09:25:01

标签: c# asp.net linq

所以我有一个奇怪的问题。当我在数据表上进行linq查询时我得到了

  

"对象引用未设置为对象的实例。"

但是当结果使用forloop时它正常工作.dt是一个数据表

var productdata = from data in dt.AsEnumerable() 
                  where data.Field<string>("Edited").ToString().ToUpper() == "NEW"
                  select data;//I get the object reference error here

foreach (var item in productdata) //but here the control goes inside the foreachloop even though the object refrence was null and the code gets executed correctly
{
   //operation
}

只有在最后一个iteraton之后才会再次给出null引用异常。我不明白为什么会发生这种情况

4 个答案:

答案 0 :(得分:4)

productdata中的项目是懒惰产生的,异常可能发生在Where子句中:

where data.Field<string>("Edited").ToString().ToUpper() == "NEW"

productdata序列不为空,因此foreach可以开始执行,但是在调用MoveNext并且访问Edited字段并且发现为null之前不会抛出异常

答案 1 :(得分:1)

按如下方式更新您的linq查询:

var productdata = (from data in dt
                  where data.Field<string>("Edited").ToString().ToUpper() == "NEW"
                  select data)
                  .ToList();//I get the object reference error here

这将立即返回结果集,并验证foreach循环。

答案 2 :(得分:1)

为什么在这里使用linQ 您可以使用

简单地获得输出
 var productdata = dt.Select("Edited='NEW'");

答案 3 :(得分:0)

我找到了答案。你看我通过读取excel文件来创建这个数据表。并且在文件中只有一行在编辑列中有“新”。其余的都是空的。一旦我将虚拟值放在其余的行中,它就开始完美地工作了。 Donno为什么会这样,但至少让我的代码工作