在LINQ2SQL中返回可为null的DateTime

本文关键字:null DateTime LINQ2SQL 返回 | 更新日期: 2023-09-27 18:25:07

下面的LINQ2SQL查询抛出一个错误,指出它无法将null放入DateTime或更具体地说

不能将null值分配给类型为System.DateTime的成员,该成员是类型的不可为null的值

这是代码,错误出现在LINQ行,即d = (from...行。

internal static DateTime? GetDateOfLastSkew(DateTime date, DateTime expiry)
{
    object d;
    using (SAFEX db = new SAFEX())
    {
        d = (from skew in db.Skew
             where skew.CalibrationDate.Date <= date.Date
                && skew.Expiry.Date == expiry.Date
             select skew.CalibrationDate).Max();
    }
    return d == DBNull.Value ? null : d as DateTime?;
}

但是dobject,所以它在为其分配null时不会遇到问题,这意味着它一定发生在LINQ查询中的某个地方。

我做错了什么?

在LINQ2SQL中返回可为null的DateTime

当对DateTime等不可为null的类型的集合调用时,Max()将返回该不可为Null类型的值,或者如果集合中没有项则抛出。

d可能是一个对象,但您试图分配给它的唯一对象是DateTime,所以您要得到的唯一对象就是DateTimeDateTime?(您可以取消框到其中任何一个)。它永远不会设置为DBNull.Value(它在linq中几乎没有用处,主要用于直接处理数据库的较低级别)。

如果您知道总会有至少一个匹配行,那么忘记d,只获取DateTime,并在返回时将其强制转换为DateTime?

internal static DateTime? GetDateOfLastSkew(DateTime date, DateTime expiry)
{
  using (SAFEX db = new SAFEX())
  {
    return (from skew in db.Skew
         where skew.CalibrationDate.Date <= date.Date
            && skew.Expiry.Date == expiry.Date
         select skew.CalibrationDate).Max(); // Max returns a DateTime.
  }
}

如果你不知道总会有至少一个匹配,那么在selcet中强制转换为DateTime?,这样Max()现在就可以处理一个可以为null的类型,并且可以在适当的时候返回null:

internal static DateTime? GetDateOfLastSkew(DateTime date, DateTime expiry)
{
  using (SAFEX db = new SAFEX())
  {
    return (from skew in db.Skew
         where skew.CalibrationDate.Date <= date.Date
            && skew.Expiry.Date == expiry.Date
         select (DateTime?)skew.CalibrationDate).Max(); // Max returns a DateTime or null on no matches.
  }
}

将结果select强制转换为null:

d = (from skew in db.Skew
     where skew.CalibrationDate.Date <= date.Date
        && skew.Expiry.Date == expiry.Date
     select ((DateTime?)skew.CalibrationDate)).Max();
return d;