为什么匿名类型实例不能接受实体框架查询返回的空值?

2024-03-18

当我尝试运行以下实体框架查询时:

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(使用前将#替换为@)

为什么匿名类型实例不能接受实体框架查询返回的空值? 的相关文章

随机推荐