2012-01-23 12 views
5

Estoy tratando de obtener una lista de fechas de mi tabla, que contiene una serie de valores DateTime en una columna llamada StartTime. Mi predecesor estaba usando el siguiente código SQL:Subcadena de un DateTime con extensiones de Linq a Sql

SELECT DISTINCT SUBSTRING(CONVERT(VARCHAR(50), StartTime, 120), 1, 10) 

Esto se traduce en una lista distinta de fechas en el formato "aaaa-MM-dd" para cada fila de la tabla. Estoy tratando de convertir esto en LINQ to SQL de la siguiente manera:

query.Select(o => o.StartTime.ToString("yyyy-MM-dd")).Distinct() 

Sin embargo, esto resulta en un error "Método 'System.String ToString (System.String)' no tiene traducción apoyado a SQL "

¿Cómo puedo hacer esto Subcadena/Convertir usando Linq-to-SQL?

Gracias!

Respuesta

5

lugar de confiar en el procesamiento de cadenas, se puede manejar esto a través de DateTime properties supported in LINQ to SQL:

var results = query.Select(o => o.StartTime.Date).Distinct(); 

Si desea ver esto como una cadena, más adelante, se puede utilizar LINQ a objetos para convertir los resultados:

var stringResults = results.AsEnumerable().Select(d => d.ToString("yyyy-MM-dd")); 
3

que haría:

query.Select(o => o.StartTime.Date) 
    .Distinct() // Runs on the database 
    .AsEnumerable() // Convert to local sequence 
    .Select(date => date.ToString("yyyy-MM-dd")) // Runs on the client 

El DateTime.Date propiedad (las tiras de la parte sub-fecha de salida) se apoya en LINQ a SQL, así que todo no sea la fecha-formateo se ejecuta en la base de datos.

+0

Eso sería distinto en el valor de fecha y hora completo, no en la parte de la fecha. –

+0

@Jon: No, sería distinto solo en la parte de fecha. Tenga en cuenta la asignación a DateTime.Date en la cláusula Select. – Ani

+0

Sí, simplemente lo he leído mal allí. –