Нулевое значение не может быть назначено члену с типом System.DateTime - PullRequest
3 голосов
/ 26 ноября 2011

У меня есть исключение:

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 ]

8 голосов
/ 26 ноября 2011

Это одна из точек, где LINQ to SQL - это утечка абстракции.Семантика функции Max() в C # - выбросить InvalidOperationException, если в последовательности нет элементов.Семантика функции SQL MAX() - возвращать NULL.Код C # компилируется так, как будто семантика C # соблюдается, но код никогда не выполняется как код C #.Он переведен на SQL, где правила семантики SQL.

Чтобы справиться с этим, вам нужно решить, что вы хотите, когда нет соответствующих элементов.Если вы хотите получить значение null, явно объявите переменную, допускающую значение 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();
0 голосов
/ 26 ноября 2011

Скорее всего проблема в: d.date! = Null ... потому что дата не может быть нулевой. Другим вариантом может быть сделать его обнуляемым (используя суффикс типа?) Или использовать что-то вроде DateTime.MinValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...