1

我正在审查一些遗留代码,并遇到了一个似乎会引发不需要的异常的片段。本质上,代码(EntityFramework 查询)如下所示:

var serviceId = (Guid?) person.Services.FirstOrDefault(s => s.Name == "foo").Id;
bool inService = serviceId.HasValue;

也就是说, aperson有多个服务分配给它们,我们返回的是第一个Name服务foo。然后,我们获取该Service实例的 Id 属性(一个 Guid),并将其强制转换为可为空的 Guid。最后,如果该可为空的 Guid 具有值,则此人必须在该服务中。

(注意:这不是我选择上面写的方式,这正是我正在使用的)

我有一种感觉,当这个人不属于名为“foo”的服务(或者实际上,任何服务)时,这段代码只会抛出异常,因为FirstOrDefault调用将返回一个null Service实例,并且访问该Id属性只会抛出一个NPE。

我向原始开发人员询问了此代码段,并被告知执行以下操作:

(T?) entity.<non-existent entity>.SomeProperty

将简单地返回一个空对象,而不是抛出一个 NPE。此外,这种类型的“安全 null 处理”发生在 Entity Framework 查询中。

这似乎令人难以置信的违反直觉,甚至感觉不应该是可能的。我试着研究这个,但我没有发现任何类似的东西。有人对这个有经验么?我 100% 很高兴发现自己错了并学到了新东西,但这对我来说并不正确。

作为附录,我确实尝试使用 EntityFramework 连接在 Linqpad 中运行上面的查询,并且在尝试访问空对象属性时确实生成了 NPE

4

1 回答 1

1

FirstOrDefault将返回null一个对象。EntityFramework 将确保实体上所有复杂类型的属性都不是null,但它会返回null该查询的结果。

于 2013-10-16T21:02:10.263 回答