为什么匿名类型实例不能接受entity framework查询返回的空值?
当我尝试运行以下entity framework查询时:
var l = (from s in db.Samples let action = db.Actions.Where(x => s.SampleID == x.SampleID && x.ActionTypeID == 1).FirstOrDefault() where s.SampleID == sampleID select new { SampleID = s.SampleID, SampleDate = action.ActionDate, }).ToList();
我得到以下exception:
转换为值类型“DateTime”失败,因为实现值为null。 结果类型的generics参数或查询必须使用可空类型。
问题可能是Action.ActionDate
在EF模型中定义为不可为空的DateTime
,但是当没有为Sample
分配相关操作时,查询返回null
。
解决方法是返回具有可空属性的非匿名类型,但为什么匿名类型不能接受null结果? 是否可以以某种方式强制使用可空属性创建匿名类型?
您使用的是匿名类型,而不是generics类型。 匿名类型由编译器在编译时定义。 最后,就像你创造了一个
class MyEntity { public readonly int SampleID; public readonly DateTime SampleDate; }
编译器根据您在new
的=
右侧使用的类型“选择”这些类型。 因此,如果SampleID为int
且ActionDate
为DateTime
则将使用这些类型。
现在,当entity framework执行查询并“反序列化”“ MyEntity
”类中的数据时,它会尝试将SQL接收的null
转换为DateTime
,并且转换失败。 解决方案是将ActionDate
定义为DateTime?
在匿名类型:
SampleDate = (DateTime?)action.ActionDate,
或者在ActionDate
为null
时为SampleDate
赋值:
SampleDate = (DateTime?)action.ActionDate ?? default(DateTime),
(这第二个解决方案未经测试,因为我附近没有SQL Server,如果它工作, SampleDate
将是一个DateTime
并且将包含查询返回的日期或日期为null
时的DateTime.MinValue
)