我有例外:
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个或更多数据时。 这个错误是我希望在具体用户没有添加任何小时的表中添加小时数。 我不知道如何解决它......
答案 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的东西。