【问题标题】: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();