Как OrderBy Дата хранится в поле Varchar в EF4 - PullRequest
1 голос
/ 16 мая 2011

У нас есть устаревшая база данных (SQLServer 2008) с тысячами строк в ней.Каждая запись имеет поле logdate, которое является датой, но хранится как varchar в формате 21/04/2010 16:40:12.

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

Есть ли способ выполнить фильтрацию и упорядочение в Entity Framework 4.

Это то, что, как мы думали, могло бы работать, но оно не удалось.

from c in db.changes
where [DateTime]c.logdate > DateTime.Today()
orderby [DateTime]c.logdate
select c;

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 16 мая 2011

Нельзя проанализировать строку в дату на сервере БД с помощью любой встроенной функции L2E.

Вы можете:

  1. сопоставить функцию БД самостоятельно,
  2. написать SQL и выполнить его с ObjectContext.ExecuteStoreQuery, или
  3. исправить метаданные.

Я бы выбрал последнее, если бы это был я.

1 голос
/ 16 мая 2011

Я не уверен, что вы можете сделать это через чистый LINQ, если вы не создадите свои собственные функции LINQ.Если вы можете выполнить специальный запрос и заставить EF4 преобразовать его обратно в объекты, как вы можете это сделать в методе DataContext.Translate LINQ2SQL, вы можете преобразовать его следующим образом:

CONVERT(datetime, logdate, 103)

И, таким образом, ваш запрос будетбыть:

SELECT
    *
FROM
    changes
WHERE
    CONVERT(datetime, logdate, 103) > GETDATE()
ORDER BY
    CONVERT(datetime, logdate, 103)

В качестве альтернативы, если вы можете добавить в схему (я полагаю, вы не можете изменить столбец varchar, чтобы он изначально сохранялся как дата / время), вы можете добавить вычисляемый столбец следующим образом:

ALTER TABLE
    changes
ADD
    logdateDatetime AS CONVERT(datetime, logdate, 103) PERSISTED

А затем запросите столбец logdateDatetime вместо logdate.

0 голосов
/ 16 мая 2011

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

...