实体框架 - 在null对象上转换属性不会抛出异常?

时间:2013-10-16 20:57:38

标签: c# linq entity-framework

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

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

也就是说,person分配了多个服务,我们将返回Namefoo的第一个服务。然后,我们在Service实例上获取Id属性(Guid),并将其转换为可以为空的Guid。最后,如果那个可以为空的Guid有一个值,那么这个人必须在那个服务中。

(注意:这不是我选择编写上述内容的方式,而是我正在使用的内容)

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

我向原始开发人员询问了这个片段,我被告知要执行以下操作:

Id

将简单地返回一个null对象,而不是抛出一个NPE。此外,这种类型的“安全空处理”与实体框架查询一起发生。

这看起来非常违反直觉,甚至不觉得它应该是可能的。我试过研究这个,但我没有发现任何东西。有人对这个有经验么?我100%高兴地发现我错了并且学到了新的东西,但这对我来说感觉不对。

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

1 个答案:

答案 0 :(得分:1)

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