Ссылка на SQL — Vb.net дата и время

#vb.net #linq #linq-to-sql

#vb.net #linq #linq-to-sql

Вопрос:

Я пытаюсь отобразить дату-время.Минимальное значение, если в моем запросе Linq to SQL Дата lastLogon равна нулю.

 Dim ExtUsrsQry = 
    (From qryItem In dc1.ExternalUserAccesses                                
     Where qryItem.QuarterId = GetCurrentQuarterId()
     Select Id = qryItem.Id,
         LastLogonDate = IIf((qryItem.LastLogonDate.HasValue), Convert.ToDateTime(qryItem.LastLogonDate).ToShortDateString(), DateTime.MinValue.ToShortDateString())
     ).ToList()
  

Это не работает. Как я могу исправить этот запрос?

Комментарии:

1. Вам не хватает ) . Вставьте его перед .ToList()

2. При вставке сюда я удалил дополнительные строки кода, чтобы все выглядело просто. Должно быть, я пропустил это, когда копировал сюда.

3. Какой тип ExternalUserAccesses.LastLogonDate ? Полный тип базы данных, включая, является ли он обнуляемым (я предполагаю, что это так)

4. Это datetime и допускает нули

5. Тогда зачем вы это делаете Convert.ToDateTime(qryItem.LastLogonDate) , если это уже datetime? Это должно быть qryItem.LastLogonDate.Value без какого-либо преобразования.

Ответ №1:

Я думаю, что проблема заключается в NULL DATETIME исходящем из SQL, который находится DateTime? в .Net. Ваш код был бы намного проще и понятнее, если бы вы использовали null coalescence

 Dim ExtUsrsQry =
    (From qryItem In dc1.ExternalUserAccesses
     Where qryItem.QuarterId = GetCurrentQuarterId()
     Select Id = qryItem.Id, LastLogonDate = If(qryItem.LastLogonDate, System.Data.SqlTypes.SqlDateTime.MinValue)
    ).ToList()
  

Редактировать

Я обновил ответ, чтобы вернуть значение null, объединяющееся с If() System.Data.SqlTypes.SqlDateTime.MinValue вместо .Чистый эквивалент.

Комментарии:

1. Я попробовал приведенный выше код — не сработало — Исключение типа ‘System.Data.SqlTypes. Исключение SqlTypeException’ произошло в System.Data.dll но не был обработан в пользовательском коде Дополнительная информация: переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 утра и 31/12/9999 11: 59: 59 вечера.

2. В сочетании с этим должен быть какой-то другой код, из-за которого он не работает. Как только вы выберете анонимный тип после этого кода, вернетесь ли вы к SQL? Этот код пытается вернуть, DateTime.MinValue который намного раньше, чем SQLDateTime.MinValue . Если вам нужно что-то еще сделать с датой (поместить ее обратно в sql или что-то еще), тогда вам следует использовать System.Data.SqlTypes.SqlDateTime.MinValue . Я отредактирую свой пост.