#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
. Я отредактирую свой пост.