C # присваивать значение даты и времени только если не NULL - PullRequest
0 голосов
/ 18 октября 2018

У нас есть пользовательский объект, который я пытаюсь назначить и заполнить из набора данных.Он работает нормально, если в полях даты и времени нет значения NULL.

Вот пример объекта:

public class Test
{

    public DateTime Date1{ get; set; }
    public DateTime Date2{ get; set; }
 }

Нам интересно, как лучше обойти присвоение любого значения, если значение равно нулю:

var convertedList = (from rw in ds.Tables[0].AsEnumerable()
    select new Test()
       {
          Date1 = Convert.ToDateTime(rw?["StartDate"]),
          Date2 = Convert.ToDateTime(rw?["EndDate"])
        }).ToList();

Следующее генерирует исключение (как и должно быть), когда ноль.Просто интересно, лучшая практика справиться с этим?Обратите внимание, что мы не можем использовать обнуляемую дату и время (datetime?) Из-за внешнего приложения.

В идеале, мы бы не хотели назначать дату и время, если null

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Собираетесь ли вы для проверки работоспособности введенных значений?Если так, то я могу назвать то, что я называю «Пассивная отчетность об ошибках».

INotifyDataErrorInfo - это все, что нужно сообщить пользователю о проблемах и разрешить вам проверять наличие ошибок перед тем, как приступить- без «обращения» к исключениям.

Вы часто используете его в WPF, где может потребоваться, чтобы ViewModel принимала значения NULL или даже строки для чисел (по причине полного представления), но Модель не может принимать Nullзначения или что-либо, кроме проанализированных целых чисел.

0 голосов
/ 18 октября 2018

Возможно, вы захотите присвоить какое-то значение по умолчанию, например:

Date1 = rw?["StartDate"]==null?DateTime.MinValue:Convert.ToDateTime(rw?["StartDate"]);

Или просто игнорировать значения с нулевыми значениями:

var convertedList = (from rw in dt2.AsEnumerable() where rw["StartDate"] != null && rw["EnDate"] != null
    select new Test()
    {
        Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
        Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
    }).ToList();
0 голосов
/ 18 октября 2018

Вы можете проверить NULL и заменить желаемой датой.

var convertedList = (from rw in dt2.AsEnumerable()
    select new Test()
    {
        Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
        Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
    }).ToList();
0 голосов
/ 18 октября 2018

Не можете ли вы использовать DateTime.TryParse, который будет пытаться преобразовать строку в dateTime, но если это невозможно, он будет использовать dateTime.minValue?

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