【问题标题】:Object reference not set to an instance of an object in LINQ C#对象引用未设置为 LINQ C# 中的对象实例
【发布时间】:2015-10-09 07:05:50
【问题描述】:

我有一个名为 dtMondayNewsLetter 的 DataTable,当 DT 没有返回任何行时。 i.e. Empty

它显示一个错误对象引用 未设置为对象的实例

代码

CurrentDirection = Convert.ToString((from DataRow dr in dtMondayNewsLetter.Rows 
                    where (int)dr["PostID"] == PostID select (string)dr["Direction"])
                           .FirstOrDefault()).Trim();

我需要在上面的代码中做些什么来消除错误。

【问题讨论】:

标签: c# asp.net linq exception object-reference


【解决方案1】:

如你所说,查询

from DataRow dr in dtMondayNewsLetter.Rows 
where (int)dr["PostID"] == PostID 
select (string)dr["Direction"]

不返回任何行,因此FirstOrDefault() 返回null

所以你可以简单地做一个if 来检查结果是否可用..

var resultString = (from DataRow dr in dtMondayNewsLetter.Rows
                    where (int)dr["PostID"] == PostID 
                    select (string)dr["Direction"])
                   .FirstOrDefault();

if (resultString != null) 
{
    CurrentDirection = resultString.Trim();
}
else
{
    //case, when no rows
}

【讨论】:

    【解决方案2】:

    要扩展我的评论,我会这样做:

    foreach (DataRow dr in dtMondayNewsLetter.Rows)
    {
        if (dr["PostID"] != DBNull.Value && dr["Direction"] != DBNull.Value)
        {
            if ((int)dr["PostID"] == PostID)
            {
                CurrentDirection = dr["Direction"].ToString();
            }
        }
    }
    

    试图通过将所有内容都放入 LINQ 语句来保持简洁并不总是最佳的。在您的情况下,可能有许多对象或数据,即NULL,从而导致空引用异常异常。

    在一行 LINQ 语句中,很难确定 NULL 对象在哪里。将该 LINQ 语句拆分为 for...each 循环会使事情变得容易得多,并获得完全相同的结果。

    但是,如果“PostID”和“Direction”不可为空(因此无需使用 DBNull.Value 检查),则使用 @nopeflow 答案,因为这比您当前的实现更安全。

    【讨论】:

      【解决方案3】:

      您可以使用Null-Coalescing Operator。如果FirstOrDefault 返回null,则返回空字符串。

      CurrentDirection =
          Convert.ToString(
              (from DataRow dr in dtMondayNewsLetter.Rows
                  where (int) dr["PostID"] == PostID
                  select (string) dr["Direction"]).FirstOrDefault() ?? "").Trim();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多