misaqyrn9677 Ответов: 2

Системный метод.датавремя разобрать(системы.строки) не поддерживается перевод на кв.


Привет
Я хочу запустить этот код, но ошибка это сообщение "метод" системы.Датавремя Разобрать(Системы.Строка)' не поддерживается перевод на SQL"
Я Не Должен Изменять Определение Таблицы, Но Сравнивать Поле Таблицы С Проверяемой Датой И Временем
Переграды
Yarian

Код С# :
DataClasses1DataContext db = new DataClasses1DataContext();

DateTime D = new DateTime();
D = DateTime.Now;
var query = db.Tables.Where(x => DateTime.Parse(x.DT) > D).ToList();
foreach (var item in query)
{
    MessageBox.Show(item.DT);
}


Схема Таблицы :
CREATE TABLE [dbo].[Table] (
    [DT] NVARCHAR (50) NULL
);


Что я уже пробовал:

IAM изменить поле из varchar(50) В nvarchar(50)
Но я не должен меняться на дату и время

2 Ответов

Рейтинг:
2

Philippe Mori

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

Например, вы можете добавить новый столбец nullable для даты, написанной в правильном формате, а затем обновить все обновления, чтобы обновить оба столбца. Как только все приложения будут обновлены, вы можете вручную обновить любой элемент, который все еще является нулевым из текстового столбца. Как только это будет сделано, вы можете сделать этот столбец обязательным (если это необходимо). В этот момент Вы можете обновить весь код, который читает базу данных, чтобы прочитать новый столбец. Как только это будет сделано, вы можете удалить старый текстовый столбец.

Тогда с этого момента вам больше не придется иметь дело с неправильным типом столбца, и это упростит любой код РЭБ, который читает или обновляет базу данных.

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

Если это действительно невозможно сделать, то я надеюсь, что, по крайней мере, текстовый столбец отформатирован в порядке года, месяца и дня, так как в противном случае было бы больно делать какое-либо сравнение.

Вы также можете рассмотреть возможность выполнения хранимой процедуры или ручного написания SQL-кода, который устранит эту проблему. Это также можно было бы сделать с Linq и SubString, но я не уверен.


Рейтинг:
0

David_Wimbley

Не зная больше о вашей проблеме/формате ваших дат, я думаю, что у вас есть 2 варианта

1) преобразуйте свою дату и время.Теперь переменная к формированию строки, чтобы сделать ваше сравнение. Хотя я не думаю, что это достигнет того, чего вы хотите.

Экс:

ВАР д = Датавремя.Сейчас.Метод toString("ггггммдд")

2) место .Список до этого .Предложение Where вашего запроса. Проблема в том, что.ToList-это команда, выполняемая для базы данных, и для DateTime нет преобразования Linq в сущности.Разбор.

Если бы вы сделали следующее

var query = db.Tables.ToList().Where(x => DateTime.Parse(x.DT) > D);


Затем он будет выполняться против базы данных до того, как попытается перевести DateTime.Разбор на SQL. Однако это может создать много проблем, если вы имеете дело с большим количеством данных, поскольку это считывает всю таблицу таблиц в память перед фильтрацией.

Я бы не предложил этого, но учитывая, что вы говорите, что не можете изменить эту схему. Это достигло бы того, о чем вы просите.