【发布时间】:2015-04-01 19:16:33
【问题描述】:
当我尝试运行以下实体框架查询时:
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”失败,因为具体化 值为空。 结果类型的通用参数或查询 必须使用可空类型。
问题可能是Action.ActionDate在EF模型中被定义为不可为空的DateTime,但是当没有分配给Sample的相关动作时查询返回null。
解决方法是返回一个具有可为空属性的非匿名类型,但是为什么匿名类型不能接受空结果呢?可以以某种方式强制使用可为空的属性创建匿名类型吗?
【问题讨论】:
-
没有泛型类型。这里有匿名类型。匿名类型在编译时“定义”
-
你可以试试
SampleDate = (DateTime?)action.ActionDate -
Action.ActionDate is defined as non nullable DateTime in EF model那是你的问题。如果数据库列可以为空,则它在模型中不应为不可空。 -
@Servy 当 Sample 的 Action 存在时,总是用 ActionDate 创建的,但是 Sample 可以在没有某些 ActionType 的动作的情况下存在,例如1. 所以在 Action 表/类中它是不可为空的,但在视图中可以为 NULL。
-
@Servy 经典案例是
left join...ActionDate可以是不可为空的,但结果值可以是null。
标签: c# entity-framework anonymous-types