【问题标题】:NullReferenceException Error when trying to iterate a IEnumerator尝试迭代 IEnumerator 时出现 NullReferenceException 错误
【发布时间】:2015-07-03 06:05:45
【问题描述】:

我有一个数据表,想用 LinQ 以这种格式选择一些记录:

  var result2 = from row in dt.AsEnumerable()
                              where row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
                                    && (String.Compare(row.Field<string>("StrDate"), dtStart.Year.ToString() +
                                                                                    (dtStart.Month < 10 ? '0' + dtStart.Month.ToString() : dtStart.Month.ToString()) +
                                                                                    (dtStart.Day < 10 ? '0' + dtStart.Day.ToString() : dtStart.Day.ToString())) >= 0
                                    && String.Compare(row.Field<string>("StrDate"), dtEnd.Year.ToString() +
                                                                                   (dtEnd.Month < 10 ? '0' + dtEnd.Month.ToString() : dtEnd.Month.ToString()) +
                                                                                   (dtEnd.Day < 10 ? '0' + dtEnd.Day.ToString() : dtEnd.Day.ToString())) <= 0)
                              group row by new { Year = row.Field<int>("Year"), Month = row.Field<int>("Month"), Day = row.Field<int>("Day") } into grp
                              orderby grp.Key.Year, grp.Key.Month, grp.Key.Day
                              select new
                              {
                                  CurrentDate = grp.Key.Year + "/" + grp.Key.Month + "/" + grp.Key.Day,
                                  DayOffset = (new DateTime(grp.Key.Year, grp.Key.Month, grp.Key.Day)).Subtract(dtStart).Days,
                                  Count = grp.Sum(r => r.Field<int>("Count"))
                              };

在这段代码中,我尝试使用以下代码对其进行迭代:

 foreach (var row in result2)
 {
   //... row.DayOffset.ToString() + ....
 }

发生了这个问题: 对象引用未设置为对象的实例。

我认为当没有符合上述条件的记录时会发生这种情况。 我尝试将其更改为这样的枚举器,并使用 MoveNext() 检查数据是否存在:

    result2.GetEnumerator();
 if (enumerator2.MoveNext()) {//--}

但仍然是同样的错误。

有什么问题?

【问题讨论】:

  • @SarahN ... if(result2!=null) foreach(......){...}
  • @Thirisangu 一个 linq 查询永远不会返回 null。问题出在查询内部。
  • @Sloth LINQ 查询永远不会返回 null !!! :(

标签: linq ienumerable nullreferenceexception object-reference ienumerator


【解决方案1】:

我猜在一行或多行中Medianull

然后您在null 上调用Equals,这会导致NullReferenceException

你可以添加一个空检查:

var result2 = from row in dt.AsEnumerable()
              where row.Field<string>("Media") != null
                 && row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
                 ...

或使用代理值,例如:

var result2 = from row in dt.AsEnumerable()
              let media = row.Field<string>("Media") ?? String.Empty
              where media.Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
              ...

(注意最后一种方法略有不同)

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多