当执行foreach搜索空值时,它会抛出异常,而不是执行为null-objects指定的代码。
foreach (Requirement requirement in DBRequirements)
{
if (this.Repository.GetElementByGuid(requirement.Guid) == null)
{
hasChanges = true;
requirement.IsDeleted = true;
}
}
Repository.GetElementByGuid()
是Enterprise Architect的一个功能。我不能修改这个,因此我不得不假设没有找到它会立即抛出异常而不是返回null
? (一直无法确定,文档在这方面很缺乏。)我正在考虑使用try catch
作为if else
,但我想知道是否有人有更好的建议。
基本上应该发生什么;它会检查数据库中的每个需求,如果它的Enterprise Architect对应项仍然存在。如果没有,则DB应将当前需求标记为IsDeleted
,如果它不执行任何操作。这是更新数据库的同步周期的一部分。
Guid是Enterprise Architect中的唯一标识符。
编辑:忘了实际提到异常..它在if语句中抛出异常为:
NullReferenceException
...在GetElementByGuid(requirement.Guid)
上,声明当前上下文中不存在此类元素。
澄清;
直接从数据库中提取DBRequirements并检查是否为空,requirement.Guid不能为null,因为它是数据库中的主键(因而是NOT NULL),数据库记录可能根本就不存在它。 This.Repository在构造函数中声明(在运行时使用调试器进行检查,它也不是null
)。
这就是为什么我无法找出抛出异常的原因。有些东西返回null
,但是这个foreach中没有任何东西确实有null
- 值。
答案 0 :(得分:3)
尝试使用DBRequirements
Guids
foreach (Requirement requirement in DBRequirements.Where(r => r?.Guid != null))
{
if (this.Repository.GetElementByGuid(requirement.Guid) == null)
{
hasChanges = true;
requirement.IsDeleted = true;
}
}
答案 1 :(得分:1)
尝试以下代码..
foreach (Requirement requirement in DBRequirements)
{
if (requirement != null)
{
if (this.Repository.GetElementByGuid(requirement.Guid) == null)
{
hasChanges = true;
requirement.IsDeleted = true;
}
}
}