【发布时间】:2019-03-07 16:14:02
【问题描述】:
我正在使用 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 循环开始时都为空。
更新 2: 我发现this link 似乎有人在使用 LINQ to SQL 时遇到了几乎相同的问题。我明白了答案的要点,但不完全理解它对我上面的两个问题的潜在影响。
【问题讨论】:
-
我怀疑这是可能的。如果没有 null 检查代码
EquipmentType = e.EquipmentType.Name也将失败。你确定你的观察是正确的?我在最后尝试了一个快速代码示例,但它按预期失败了。 -
@RBT 实际上,运行我的代码不会产生任何错误,它会愉快地运行
EquipmentType = e.EquipmentType.Name并将所有值设置为 null(即,e = null,e.EquipmentType = null , 和 e.EquipmentType.Name = null)。 -
你能用
EquipmentClass的定义更新你的帖子吗? -
我已经更新了我的答案。如果您将
foreach枚举到最后,它将失败。当对应的匹配可用于连接时,它可能会通过几次初始迭代。
标签: c# linq linq-to-entities