在SQL和C#

时间:2015-07-07 22:14:17

标签: c# sql-server linq entity-framework linq-to-entities

我想将一个实体和一个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运行。

如何编写此逻辑一次,以表示两种情况?

0 个答案:

没有答案