我想将一个实体和一个1 - 0..1相关实体的非可空属性投影到一个新结果中。这是一个常见的需求,类似于How to select non nullables from nullable relation in Entity Framework
没问题,你说,对吗?在我的例子中,我只是将值与非可空的回退合并。
appointment => new ClientAppointmentViewModel
{
Id = appointment.Id,
Phone = appointment.Phone.Normalized ?? appointment.Client.Phone.Normalized,
约会可能没有与之关联的一次性Phone
号码,因此我们会拨打客户的个人资料电话号码。耶!
然而,问题是,我可以将其写为共享代码以针对SQL数据和内存实体运行吗?
这会将作为商店表达式执行。当我直接从数据库中检索ClientAppointmentViewModel
列表时,一切都很顺利。从appointment.Phone.Normalized
生成的整个SQL查询关系被解释为一个可以为空的值,并且coalesce正常工作。
但是,我也在单个内存实体实例中使用它。假设我已插入约会并返回单个结果ClientAppointmentViewModel
以在我的UI中进行确认。在这种情况下,我的约会已经在内存中,因此转换以C#运行并返回空引用错误:appointment.Phone
有时为空。
我可以采用另一种方式,并使用执行条件逻辑的属性(例如FallbackPhone
)扩展我的实体。这将在内存中实例上正常运行,但无法转换为商店表达式。它根本不会对SQL运行。
如何编写此逻辑一次,以表示两种情况?