Linq: сортировка по дате, когда она хранится в виде текста - PullRequest
5 голосов
/ 20 ноября 2011

Мне нужно отсортировать по дате, но дата сохраняется в виде текста в базе данных. Я использую Linq для сущностей для выполнения запросов.

При проектировании базы данных не представляется возможным изменить столбец на столбец даты, поскольку в этом столбце много разных типов данных. Существует столбец дескриптора с именем type, поэтому я буду знать, к какому типу относится конкретная строка.

Ответы [ 2 ]

2 голосов
/ 20 ноября 2011

Вы можете добавить вычисляемый столбец в таблицу, который будет преобразовывать эти строки в даты, когда ваш дискриминатор имеет конкретное значение (здесь я только что использовал 'date').

ALTER TABLE Foo
ADD trueDate AS
    CASE 
        WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101)
        ELSE NULL
    END
PERSISTED

Если у вас есть информация о времени, тогда date должно быть datetime в функции CONVERT().

Кроме того, 101 - это код стиля, указывающий ожидаемый формат MM/dd/yyyy. Если у вас есть что-то другое, обратитесь к этому: http://msdn.microsoft.com/en-us/library/ms187928.aspx,, но имейте в виду, что если вы используете стиль ниже 100, ваше выражение будет считаться недетерминированным, и вы не сможете сделать свой вычисляемый столбец PERSISTED, поэтому преобразования будет выполняться на лету с каждым запросом (вы этого не хотите).

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

0 голосов
/ 20 ноября 2011

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

Опция A .: Сортировка в памяти.

var records = db.YourTable.Where(o=>o.Discriminator =="date").AsEnumerable()
    .Select(o=>new {Entity= o, Date=DateTime.Parse(o.YourColumn)})
    .OrderBy(o.Date).Select(o=>o.Entity);

НЕ делайте этого, если у вас много строк, или если вам нужно, по крайней мере, иметь порядочность для кэширования упорядоченного результата ...

Вариант B .: Магия базы данных
Добавьте дополнительный столбец в вашу БД, сделайте дату THAT (обнуляемой) и обновите ее, если дискриминатором является дата. Вы можете обновить его в (DML) Trigger или из C # ...
ИЛИ, если преобразование простое, вы можете создать представление из него ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...