【问题标题】:Object reference not set to an instance of an object. yet foreach loop is working你调用的对象是空的。然而 foreach 循环正在工作
【发布时间】:2016-02-17 09:25:00
【问题描述】:

所以我遇到了一个奇怪的问题。当我对数据表进行 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
}

只有在最后一次迭代之后才会再次给出空引用异常。我不明白为什么会这样

【问题讨论】:

  • 我想知道为什么forrloop得到正确执行
  • 好吧,我想了这么多,那么为什么在最后一次迭代后它会给出“对象引用未设置为对象的实例”错误
  • 将您的 linq 转换为另一个 foreach 循环并调试所有步骤。

标签: c# asp.net linq


【解决方案1】:

productdata 中的项目是惰性生成的,异常可能出现在Where 子句中:

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

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

【讨论】:

    【解决方案2】:

    如下更新您的 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 循环。

    【讨论】:

    • 当我列出我立即得到异常“对象引用未设置为对象的实例。”
    • @Mysterio11 为什么要将其转换为 var ,尝试使用 dt.select() 将其放入数据行;
    • @Mysterio11 我建议在尝试构建 linq 查询之前检查“dt”(假设那是您的 dbContext.dt)不为空。
    【解决方案3】:

    为什么在这里使用 linQ 您可以在其中简单地使用

     var productdata = dt.Select("Edited='NEW'");
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-05-27
        • 2013-07-22
        相关资源
        最近更新 更多