我正在尝试迭代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如何解释它。我将在下面发布正确的代码作为答案。
答案 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);