Linq foreach循环一次然后抛出错误

时间:2018-02-01 00:50:02

标签: c# linq foreach

我正在尝试迭代linq语句中的所有结果。 我知道在foreach循环开始之前不会执行linq语句。代码在结果中逐步执行foreach循环,但是当它尝试循环第二次时,它会在对象“SelectectedEntity”上抛出错误“对象引用未设置为对象的实例”。

List<FeedEntity> EntityList = feed.entity.ToList();

IEnumerable<FeedEntity> SelectectedEntity = 
     from entity in EntityList  
     where entity.trip_update.trip.trip_id == "9571620-BCC 17_18-BCC_FUL-M-Tu-W-Th-01" 
     select entity;

foreach (FeedEntity e in SelectectedEntity)
{
    string s = e.trip_update.trip.route_id.ToString();
}

我期待SelectedEntity系列中的几十个元素。我错过了什么或者我误解了linq的运作方式。

问题不在于什么是空引用,因为我知道那是什么..但为什么我在代码中得到了一个空引用。

它与数据有关,以及linq如何解释它。我将在下面发布正确的代码作为答案。

1 个答案:

答案 0 :(得分:-1)

“对象引用未设置为对象的实例”意味着您尝试访问对象,而此对象等于null:

MyClass myObject = null;
string name = myObject.Name;

所以你有一个实体列表和一些可怕的字符串,你只希望那些元素形成你的实体列表entity.trip_update.trip.trip_id等于可怕的字符串。

您确定entity不为空,entity.trip_update不为空且...不为空吗?

您应该在查询中查看此内容

const string horribleString = "9571620-BCC 17_18-BCC_FUL-M-Tu-W-Th-01";
var result = entityList
   .Where(entity => entity != null
       && entity.trip_update != null
       && entity.trip_update.trip != null
       && entity.trip_update.trip.trip_id == horribleString);

如果您使用现代版本的C#,则可以使用the null conditional operator。这使您的查询更具可读性:

 var result = entityList
    .Where(entity => entity?.trip_update?.trip?.trip_id == horribleString);