为什么匿名类型实例不能接受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为intActionDateDateTime则将使用这些类型。

现在,当entity framework执行查询并“反序列化”“ MyEntity ”类中的数据时,它会尝试将SQL接收的null转换为DateTime ,并且转换失败。 解决方案是将ActionDate定义为DateTime? 在匿名类型:

 SampleDate = (DateTime?)action.ActionDate, 

或者在ActionDatenull时为SampleDate赋值:

 SampleDate = (DateTime?)action.ActionDate ?? default(DateTime), 

(这第二个解决方案未经测试,因为我附近没有SQL Server,如果它工作, SampleDate将是一个DateTime并且将包含查询返回的日期或日期为null时的DateTime.MinValue