无法将null值分配给System.DateTime类型的成员

时间:2011-11-26 13:09:42

标签: asp.net-mvc-3 linq-to-sql

我有例外:

The null value cannot be assigned to a member with type System.DateTime which is a non-nullable value type. 
Source Error: 
var bd = (from d in baza.hpurs where d.userID == userID && d.date !=null select d.date).Max();

我的方法:

 public ActionResult Add_hours(int userID)
    {
        var dat = DateTime.Today;

        var bd = (from d in baza.hours where d.userID == userID && d.date !=null select d.date).Max();

        if (bd != dat)
        {
            return View();
        }

     else
    {
        var dd = (from d in baza.hours where d.userID == userID && d.date == dat select d.hoursID).Single();
        return RedirectToAction("hours_is", "Employer", new { HoursID = dd });
    }
}

它运行良好,但只有当我在具体用户的小时表中有1个或更多数据时。 这个错误是我希望在具体用户没有添加任何小时的表中添加小时数。 我不知道如何解决它......

2 个答案:

答案 0 :(得分:7)

这是LINQ to SQL漏洞抽象的一个要点。如果序列中没有元素,则C#中Max()函数的语义是抛出InvalidOperationException。 SQL的MAX()函数的语义是返回NULL。 C#代码编译好像遵循C#语义,但代码永远不会作为C#代码执行。它被翻译成SQL语义规则的SQL。

要处理此问题,您需要在没有匹配元素时决定您想要的内容。如果你想要一个null值,显式声明一个可以为空的变量并向DateTime?引入一个额外的强制转换来告诉LINQ to SQL null可能会被返回。

DateTime? bd = (from d in baza.hpurs 
                where d.userID == userID && d.date !=null 
                select (DateTime?)d.date).Max();

答案 1 :(得分:-1)

问题很可能发生在:d.date!= null ...因为日期不能为空。另一个选择是使其可以为空(使用'?'类型后缀)或使用类似DateTime.MinValue的东西。