【问题标题】:Why the anonymous type instance cannot accept null values returned by the entity framework query?为什么匿名类型实例不能接受实体框架查询返回的空值?
【发布时间】: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


【解决方案1】:

您使用的是匿名类型,而不是泛型类型。匿名类型由编译器在编译时定义。最后就像你创建了一个

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

编译器会根据您在new= 右侧使用的类型“选择”这些类型。因此,如果 SampleID 是 int 并且 ActionDateDateTime 则将使用这些类型。

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

SampleDate = (DateTime?)action.ActionDate,

或者当ActionDatenull时给SampleDate一个值:

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

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

【讨论】:

  • 是的,小菜一碟...有时问比想容易。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2011-10-19
  • 2018-01-11
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多