2011-11-19 32 views
5

Necesito ordenar por fecha pero la fecha se almacena como texto en la base de datos. Estoy usando Linq para entidades para realizar consultas.Linq: Ordenar por fecha cuando se almacena como texto

La forma en que se diseña la base de datos no es factible para cambiar la columna a una columna de fecha porque hay muchos tipos de datos diferentes en esa columna. Hay una columna de descriminador llamada type, así sabré de qué tipo es una fila en particular.

+0

¿Qué desea hacer con los valores sin fecha? ¿Sueltalos? – Otiel

+0

En mi consulta, seleccionaré solo valores de fecha porque tendré un tipo en una columna diferente que me dice qué tipo es la columna de datos – Luke101

+1

@ Luke101 primero recupere todos los registros de la base de datos a la lista y luego realice operaciones en esa lista (como sorting ...) –

Respuesta

2

se puede añadir un columna calculada a la tabla que convertirá esas cadenas a fechas cuando su discriminador tiene un valor específico (aquí acabo de utilizar 'date').

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

Si usted tiene información de tiempo, entonces debe haber datedatetime en la función CONVERT().

Además, el 101 es un código de estilo que indica un formato esperado de MM/dd/yyyy. Si tiene algo diferente, consulte esto: http://msdn.microsoft.com/en-us/library/ms187928.aspx, pero tenga en cuenta que si utiliza un estilo por debajo de 100, su expresión se considerará no determinista y no podrá hacer su columna calculada PERSISTED, por lo que las conversiones se realizarán sobre la marcha con cada consulta (no quieres eso).

La columna calculada se actualizará cuando cambien los valores de la fila; de lo contrario, los valores son persistentes y consultables como en cualquier otra columna. No se requieren disparadores

+0

Wow..nice. Una cosa más. ¿Puedo poner un índice en esa columna? Almacenaré fechas, enteros, cadenas y otros tipos de datos. Me gustaría indexar la columna con diferentes tipos de datos. ¿es posible? – Luke101

+0

@ Luke101 La columna con diferentes tipos de datos se puede indexar, pero solo se indexará como varchar. Para que quede claro, la columna calculada es una columna * añadida * que contiene solo las fechas en las que el discriminador indica la fecha y, de lo contrario, es nula. Puede crear índices en una columna calculada como se describe aquí: http://msdn.microsoft.com/en-us/library/ms189292.aspx – Jay

0

Si todas las filas que contienen fechas usan el mismo formato de fecha, puede ordenarlas por su valor de cadena. Pero dado que el formato de fecha más común (es decir, inglés) NO comienza con el año, podría ser problemático.

Opción A: ordenar en la memoria.

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

no hace esto, si usted tiene una gran cantidad de líneas, o si usted tiene que, por lo menos tener la decencia de almacenar en caché el resultado ordenado ...

Opción B .: Magic de base de datos
Agregue una columna adicional a su base de datos, haga ESA fecha (anulable) y actualícela si el discriminador es la fecha. Usted puede actualizarlo en un (LMD) gatillo o desde C# ...
o si la conversión es simple se podría construir una vista fuera de él ...

Cuestiones relacionadas