Дата конвертирования LINQ, необходимо обработать неверную дату - PullRequest
1 голос
/ 29 июля 2011

Я использую LINQ-to-SQL и мне нужно упорядочить по полю даты.Поле даты хранится в виде текста и может содержать что угодно, так как это введенные пользователем данные.Мне нужно обработать случаи, когда туда была помещена недопустимая дата.
Например, дата «23.02.0000» возвращает:

Преобразование типа данных varchar втип данных datetime привел к значению вне допустимого диапазона.

Мне нужно избегать ошибок, и мне все равно, где сортируется недопустимая дата, подобная этой.Параметры проекта означают, что я не могу изменить свои исходные данные, только читать из них.
Вот пример оператора LINQ.

from x in dbo_myTable
orderby Convert.ToDateTime(x.MyDateField)
select x

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Вам определенно нужно выполнить заказ в базе данных?В этой ситуации я настоятельно рекомендую извлечь все данные, затем выполнить какое-то преобразование в коде .NET, где у вас будет гораздо больший контроль над происходящим, и затем упорядочить его в коде .NET.

В конечном счете, справиться с испорченными данными в такой ситуации сложно - чем больше у вас контроля, тем лучше.

0 голосов
/ 29 июля 2011

Вы можете сделать что-то вроде этого (исходя из вашего комментария, что все они состоят из 10 символов)

from x in dbo_myTable
orderby x.MyDateField.Substring(6, 4), x.MyDateField.Substring(0, 2), x.MyDateField.Substring(3, 2)
select x
0 голосов
/ 29 июля 2011

Первый - первый; почему вы не можете изменить базу данных, чтобы исправить, очевидно, нарушает структуру таблицы? Почему вы не можете дезинфицировать вход, когда он входит в базу данных? Почему вы не проверяете пользовательский ввод?

Теперь за ответ; ваш единственный вариант - попытка разобрать дату (с помощью DateTime.TryParse или DateTime.TryParseExact) и установить значение по умолчанию по вашему выбору, если не удается проанализировать:

from x in dbo_myTable
orderby TryConvertToDateTime(x.MyDateField)
select x

private DateTime TryConvertToDateTime(string dt)
{
   DateTime rtn = DateTime.MinValue; // or whatever you want your default to be
   DateTime.TryParse(dt,out rtn);
   return rtn;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...