Нахождение максимальной даты с помощью Entity Framework Core - в Razor Pages - PullRequest
0 голосов
/ 27 марта 2020

Я создаю веб-приложение Razor Pages, которое регистрирует пользователя на экзамене. Модель ExamRegistration имеет поле с именем MaxDateForExam, которое можно обнулять, поскольку это новая функция, добавленная в существующую базу данных позднее. При создании экзамена я хочу заполнить это поле значением после OnPost.

Если пользователь впервые подает заявку на экзамен, просто наберите ExamDate и добавьте 1 год. При последующих регистрациях (пользователь не сдал экзамен) я не могу sh создать новую MaxDate, но получаю MaxDate с первой регистрации.

Моя модель ExamRegistrations имеет следующее свойство

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? MaxDateForExam { get; set; }

На странице, где я регистрирую человека на новый экзамен, мне нужно выполнить проверку:

  • Если человек регистрируется в первый раз, я бы взял ExamDate и добавить к нему год, который затем заполнит поле MaxDateForExam.

  • Если пользователь регистрируется на экзамен, который проводится не первый раз, мне нужно поместить приложение go в таблицу ExamRegistration и взять
    существующий MaxDateForExam a значение для предыдущей регистрации (если
    один существует). Это то, что у меня есть.

Я просто не могу найти правильный код для извлечения значения MaxDateForExam. Вот часть моего кода ....

public DateTime MaxWriteDate { get; set; }                 
public Models.ExamRegistration ApplicantRecord { get; set; }

if(ExamRegistration.ExamAttempt == "1st Attempt")
     {                    
        MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
     }
     else
     {
         ApplicantRecord = _context.ExamRegistrations                        
         .Where(m => m.ApplicantID == ExamRegistration.ApplicantID && m.ExamAttempt == "1st Attempt") 
         .FirstOrDefault();

         if(ApplicantRecord == null)
          {
              MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
          }
          else
          {
               MaxWriteDate = ApplicantRecord.MaxDateForExam;   ???????FAILS????????
          }
      }

Любое направление, которое я могу получить, было бы полезно. Кажется, ошибка всегда вращается вокруг неспособности преобразовать System.DateTime? в System.DateTime. Вы пропустили актерский состав?

Я отмечу ответ как правильный и я узнал немного больше о C# и обнуляемых типах. Спасибо.

Мне удалось обойти ошибку, используя код:

MaxWriteDate = OldMaxWriteDate.MaxDateForExam ?? DateTime.MinValue;

Спасибо за помощь.

PS .... Если мне нужно отметить что-то еще (первый раз, когда вы пользуетесь большим ресурсом), пожалуйста, дайте мне знать.

Спасибо

1 Ответ

0 голосов
/ 27 марта 2020

Это потому, что значение MaxDateForExam может иметь значение null, поэтому вам не разрешено присваивать его переменной, которая не может иметь значение null. Попробуйте это:

      if(ApplicantRecord == null)
      {
          MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
      }
      else
      {
          if (MaxDateForExam.HasValue)
          {
              MaxWriteDate = ApplicantRecord.MaxDateForExam.Value;
          }
          else
          {
              // Handle case where MaxDateForExam does not have a value
          }
      }

Для получения дополнительной информации см. Документацию по типам значений, допускающих значения NULL:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types

...