2015-04-01 100 views
2

当我尝试运行下面的实体框架查询:为什么匿名类型实例无法接受实体框架查询返回的空值?

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(); 

我得到以下异常:

演员阵容价值型“日期时间”失败,因为物化 值为null。 结果类型的通用参数或查询 必须使用可为空的类型。

的问题可能是,Action.ActionDate定义为EF模型非可空DateTime,但查询返回null时有分配给Sample没有相关的动作。

解决方法是返回一个具有可空属性的非匿名类型,但为什么匿名类型不能接受空结果?匿名类型可以以某种方式强制使用可为空的属性创建吗?

+2

没有通用类型。这里有匿名类型。匿名类型在编译时“定义” – xanatos 2015-04-01 19:24:41

+2

你可以尝试'SampleDate =(DateTime?)action.ActionDate' – Grundy 2015-04-01 19:28:46

+2

Action.ActionDate被定义为EF模型**中不可为空的DateTime,**是你的问题。如果数据库列可以为空,那么它在模型中不应该是不可空的。 – Servy 2015-04-01 19:31:27

回答

4

您正在使用匿名类型,而不是泛型类型。匿名类型由编译器在编译时定义。最后,它就像你根据你的=new正确使用类型创建一个

class MyEntity 
{ 
    public readonly int SampleID; 
    public readonly DateTime SampleDate; 
} 

的类型“中选择”由编译器。所以如果SampleID是intActionDateDateTime那么这些类型将被使用。

现在,什么情况是,当实体框架执行查询和“反序列化”中的“MyEntity”类的数据,它会尝试给它的SQL收到null转换为DateTime,并转换失败。该解决方案是定义ActionDate作为匿名类型DateTime?

SampleDate = (DateTime?)action.ActionDate, 

或给SampleDate数值时ActionDatenull

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

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

+0

是的,小菜一碟...有时候比想一想要容易些。谢谢 – 2015-04-01 19:41:45