2010-03-11 36 views
11

Básicamente, necesito el equivalente de T-SQL CONVERT(NVARCHAR(10), datevalue, 126)formato Linq 2 SQL DateTime a cadena aaaa-MM-dd

He intentado:

  1. from t in ctx.table select t.Date.ToString("yyyy-MM-dd") pero no admite excepción tiros
  2. from t in ctx.table select "" + t.Date.Year + "-" + t.Date.Month + "-" + t.Date.Day pero no creo que sea una solución utilizable, porque podría necesitar cambiar el formato.

La única opción que veo es utilizar Convert.ToString(t.Date, FormatProvider), pero necesito un proveedor de formato, y no estoy seguro de que funciona bien

FormatProvider no work, String.Format no funciona (string.Format("{0:yyyy-MM-dd}", t.Date) throws not supported exception too).

+0

¿Has probado la versión '.AsEnumerable'? – AxelEckenberger

+0

Lo intentaré hoy –

+0

Debajo de la solución funcionó para mí. Haga clic debajo del enlace http://stackoverflow.com/questions/7999771/convert-datetime-to-a-formatted-string-inside-a-linq-to-sql-query –

Respuesta

6

Suponiendo que t.Date es anulable ( DateTime?) esto podría ser el problema, pruebe a utilizar:

from t in ctx.table select (t.HasValue ? t.Date.Value.ToString("yyyy-MM-dd") : string.Empty); 

Editar: OK, segundo intento ...

El problema es la traducción a SQL que intenta traducir el .ToString() a una representación de SQL, y falla. Así que si usted debe hacer lo siguiente debería funcionar:

(from t in ctx.table select t.Date).ToList().Select(d => d.ToString("yyyy-MM-dd"))

o

(from t in ctx.table select t.Date).AsEnumerable().Select(d => d.ToString("yyyy-MM-dd"))

AsEnumerable() transforma la utiliza anteriormente IQueryable en un IEnumerable, deteniendo así la generación del SQL (en caso de LINQ a SQL) o cualquier otra transformación realizada por el proveedor que implementa el número específico IQueryable (por ejemplo, Proveedor de Linq a SQL).

Nota: antes de llamar al AsEnumerable(), debe haber completado todas las acciones que desea convertir a SQL y ejecutar en la base de datos directamente.

+0

La fecha no puede contener nulos. Además, ToString no funciona con linq2sql en datetime. –

+0

No es factible porque el recuento de filas es muy alto. –

+0

Luego use la segunda opción que inserté. – AxelEckenberger

3

¿Hay alguna razón para realizar la conversión en el lado de la base de datos? Cada vez que me encuentro con este tipo de situación, tiendo a permitir que la base de datos me proporcione los datos brutos y luego realice el masaje y la manipulación dentro de la aplicación. Dependiendo del volumen de solicitudes al servidor de la base de datos y del tamaño del conjunto de resultados, no quiero vincular el procesamiento y el tiempo de respuesta haciendo conversiones de datos que el cliente puede manejar.

+0

Necesito ejecutar alguna coincidencia de cadenas: Tengo una cadena compuesta por algunas columnas 'nvarchar' y una columna' datetime', y necesito unirla con una columna en otra tabla. –

+0

¿Puedo ver las estructuras? –

7

En caso de que alguien más tenga este problema, he resuelto este problema creando una función independiente para hacer el formato de fecha por mí.

Mi LINQ se ve algo como esto:

from a in context.table 
where ... 
select new Class 
{ 
DateString = GetFormattedString(a.DateTimeObject) 
} 

Y GetFormattedString sólo devuelve DateTimeObject.ToString ("aaaa-MM-dd"); ¡Esto funciona para mí!

+0

Estoy de acuerdo. Aunque hay varias maneras de hacer la conversión después de que ingresen los resultados de la consulta, pasar el resultado que admite nulos a un método me parece la solución más bonita. +1 –

+1

Mucho mejor que solo para este propósito fundir todo el objeto en la lista. – Saulius

0

Intente crear una clase de objeto que puede establecer las propiedades y dejar que las propiedades sean el valor de su vista .. Establezca los datos de fecha y hora de LINQ como cadena y no como fecha ... ex.

//Property class 
[DataContract()] 
public class Info 
{ 
[DataMember(Name = "created_date")] 
public string CreateDate; 
} 


//Controller 
var date = from p in dbContext.Person select p; 
CreateDate = Convert.ToDateTime(p.create_date).ToString("yyyy-MM-dd"); 

Espero que intente esto .. Tengo esto en mis aplicaciones anteriores y esto es lo que hice.

0

look no.3

var user = (from u in users 
        select new 
        { 
         name = u.name, 
         birthday = u.birthday.Value 
        }) 
        .ToList() 
        .Select(x => new User() 
        { 
         name = x.name, 
         birthday = x.birthday.ToString("yyyyMMdd") // 0埋めされるよ 
        }); 
-1

probar esto

var select = from s in db.Table 
      where s.date == someDate 
      select new 
      { 
       date = DateTime.Parse(s.date.ToString()).ToString("yyyy-MM-dd"), 
      }; 
+0

en realidad funciona en linq2sql pero no funciona en EF arroja LINQ a Entidades no reconoce el método 'System.String ToString (System.String)' método .. – Jack0fshad0ws