2011-11-19 13 views
5

Muszę sortować według daty, ale data jest przechowywana jako tekst w bazie danych. Używam Linq do podmiotów do wykonywania zapytań.Linq: Sortuj według daty, gdy jest zapisany jako tekst

Sposób zaprojektowania bazy danych uniemożliwia zmianę kolumny na kolumnę z datą, ponieważ w tej kolumnie znajduje się wiele różnych typów danych. Istnieje kolumna deskryptatora o nazwie type, więc będę wiedział, jaki typ ma dany wiersz.

+0

Co chcesz zrobić z wartościami bez wartości? Rzuć je? – Otiel

+0

W moim zapytaniu wybiorę tylko wartości dat, ponieważ będę miał typ w innej kolumnie, która mówi mi, jakiego typu kolumna danych jest – Luke101

+1

@ Luke101 najpierw pobrać wszystkie rekordy z bazy danych do listy, a następnie wykonać operacje na tej liście (jak sortowanie ...) –

Odpowiedz

2

można dodać wyliczył kolumnę do tabeli, która zamieni te łańcuchy na daty, kiedy twój dyskryminator ma określoną wartość (tutaj właśnie użyłem 'date').

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

Jeśli masz informację o czasie, a następnie date powinny być datetime w funkcji CONVERT().

Ponadto kod 101 jest kodem stylu wskazującym oczekiwany format MM/dd/yyyy. Jeśli masz coś innego, zapoznaj się z tym: http://msdn.microsoft.com/en-us/library/ms187928.aspx, ale pamiętaj, że jeśli użyjesz stylu poniżej 100, twoje wyrażenie będzie uznawane za niedeterministyczne i nie będziesz mógł wykonać obliczonej kolumny PERSISTED, więc konwersje będą wykonywane w locie z każdym zapytaniem (nie chcesz tego).

Obliczona kolumna zaktualizuje się po zmianie wartości wiersza; w przeciwnym razie wartości są utrzymywane i możliwe do wyśledzenia, tak jak w każdej innej kolumnie. Nie są wymagane żadne wyzwalacze.

+0

Wow..nice. Jeszcze jedna rzecz. Czy mogę umieścić indeks w tej kolumnie. Będę przechowywać daty, liczby całkowite, ciągi i inne typy danych. Chciałbym indeksować kolumnę za pomocą różnych typów danych. czy to możliwe? – Luke101

+0

@ Luke101 Kolumna z różnymi typami danych może być indeksowana, ale będzie indeksowana tylko jako varchar. Aby było jasne, kolumna obliczeniowa jest kolumną * dodaną *, która zawiera tylko daty, w których dyskryminator wskazuje datę, a poza tym wartość zerową. Można tworzyć indeksy w kolumnie obliczeniowej, jak opisano tutaj: http://msdn.microsoft.com/en-us/library/ms189292.aspx – Jay

0

Jeśli wszystkie wiersze zawierające daty mają ten sam format daty, który można zamówić po ich wartości ciągu. Ale ponieważ najpopularniejszy (tj. Angielski) format daty NIE zaczyna się od roku, może to być problematyczne.

Opcja A .: Sortuj w pamięci.

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); 

NIE to zrobić, jeśli masz dużo wierszy, lub jeśli trzeba, przynajmniej tyle przyzwoitości, aby buforować uporządkowaną wynik ...

Option B .: Baza danych magia Dodaj dodatkową kolumnę do bazy danych, spraw, że TAK jest Data (nullable), i zaktualizuj ją, jeśli dyskryminatorem jest data. Możesz też zaktualizować go w (DML) Wyzwalanie lub C# ...
lub jeśli konwersja jest prosta można zbudować widok z niego ...