当我尝试运行以下实体框架查询时:
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();
我收到以下异常:
转换为值类型“DateTime”失败,因为物化
值为空。任何一个结果类型的泛型参数或查询
必须使用可为 null 的类型。
问题可能在于Action.ActionDate
被定义为不可空DateTime
在 EF 模型中,但查询返回null
当没有分配相关操作时Sample
.
解决方法是返回具有可为 null 属性的非匿名类型,但为什么匿名类型不能接受 null 结果呢?是否可以以某种方式强制使用可为 null 的属性创建匿名类型?
您使用的是匿名类型,而不是泛型类型。匿名类型由编译器在编译时定义。最后就像你创建了一个
class MyEntity
{
public readonly int SampleID;
public readonly DateTime SampleDate;
}
编译器根据您在右侧使用的类型“选择”类型=
in the new
。所以如果 SampleID 是int
and ActionDate
is DateTime
那么将使用这些类型。
现在,发生的情况是,当实体框架执行查询并“反序列化”“MyEntity
“类,它试图转换null
它由 SQL 接收到DateTime
,并且转换失败。解决方案是定义ActionDate
as a DateTime?
在匿名类型中:
SampleDate = (DateTime?)action.ActionDate,
或给予SampleDate
时的一个值ActionDate
is null
:
SampleDate = (DateTime?)action.ActionDate ?? default(DateTime),
(第二个解决方案未经测试,因为我附近没有 SQL Server,如果它有效的话SampleDate
将是一个DateTime
并将包含查询返回的日期或DateTime.MinValue
当日期是null
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)