我正在使用LINQ to Entities从数据库中获取一些数据。以下是我的查询。
var location = from l in dbContext.Locations
join e in dbContext.Equipment on l.ID equals e.LocationID into rs1
from e in rs1.DefaultIfEmpty()
where ids.Contains(l.ID)
select new
{
EquipmentClass = e,
LocationID = l.ID,
LocationName = l.Name,
EquipmentName = e == null ? null : e.Name,
Description = e == null ? null : e.Description,
InServiceStatus = e == null ? false : e.InServiceStatus,
EquipmentType = e.EquipmentType.Name
};
foreach (var item in location)
{
// some logic
}
在上面的代码中,
ids
是我传入进行结果筛选的整数列表。当我获得结果时,我发现一个返回记录具有空的EquipmentClass
。我进行了一些空值检查,但意识到我忘记对其中一个属性进行空值检查。现在我期望在EquipmentType = e.EquipmentType.Name
上得到一个空引用异常,但我没有得到。令我惊讶的是,它可以正常工作,并且被设置为null。我的EquipmentClass
具有EquipmentType
的属性类型,这是另一个类。 EquipmentType
具有Name
属性,该属性是一个字符串。
- 为什么不会抛出空引用异常?
仅作为测试,我从InServiceStatus = e == null ? false : e.InServiceStatus
中删除了空值检查,并使用查询运行foreach循环时会导致无效操作异常。
- 这是否意味着我只需要对非空值进行空值检查?
更新:
foreach (var item in location)
{
var p = item.EquipmentClass.EquipmentType.Name;
}
在查询之后添加了这个代码。在分配p的值时,我遇到了空引用异常。我不确定它是如何做到的,因为它应该在foreach循环的第一行失败。如果没有声明变量p的那一行,我就不会得到空引用异常。如果有人能够解释发生了什么,我将不胜感激。只是作为参考,
item.EquipmentClass
和item.EquipmentType
的值在foreach循环开始时都是null。
更新2:
我在这个链接中找到了一个与我使用LINQ to SQL几乎完全相同的问题。我理解了答案的要点,但不完全理解它对我上面提出的两个问题可能产生的影响。
EquipmentType = e.EquipmentType.Name
并将所有值都设置为 null(即 e = null,e.EquipmentType = null 和 e.EquipmentType.Name = null)。 - Sudsy1002