为什么匿名类型实例不能接受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
)
上述就是C#学习教程:为什么匿名类型实例不能接受entity framework查询返回的空值?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031962.html