在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?;
}
但是d
是object
,所以它在为其分配null
时不会遇到问题,这意味着它一定发生在LINQ查询中的某个地方。
我做错了什么?
当对DateTime
等不可为null的类型的集合调用时,Max()
将返回该不可为Null类型的值,或者如果集合中没有项则抛出。
d
可能是一个对象,但您试图分配给它的唯一对象是DateTime
,所以您要得到的唯一对象就是DateTime
或DateTime?
(您可以取消框到其中任何一个)。它永远不会设置为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;