2011-07-31 28 views
6
List<Post> list = 
(
    from c in db.TitleComments 
    join t in db.Titles on c.TitleId equals t.Id 
    join u in db.Users on c.UserId equals u.Id 
    where t.Id == _titleId && c.Date > time 
    orderby c.Date descending 
    select new Post { Username = u.Username, PostingDate = c.Date.ToString(), Data = c.Comment } 
).ToList(); 

El código anterior causa una excepción en la conversión de la fecha a la cadena, PostearFecha = c.Date.ToString(). ¿Alguna idea de cómo evitar esto?LINQ convertir DateTime a la cadena

error

Excepción: { "LINQ a Entidades no reconoce el método de método 'System.String ToString()', y este método no se puede traducir en una expresión tienda"}

+2

¿Qué excepción? – BrunoLM

+1

@BrunoLM, linq está tratando de convertir la fecha en cadena usando sql pero dado que no hay un método ToString() en sql y no puede convertirlo, creo que este comportamiento es por diseño. – Joakim

+0

puede darnos la excepción exacta. No creo que esto sea un error en SQL. – Baz1nga

Respuesta

16

LINQ está tratando de convertir la fecha a cadena mediante sql pero dado que no existe un método ToString() en SQL que no puede convertirlo, este comportamiento es por diseño - Joakim

en otras palabras, el retorno de la misma fecha y convertirlo en una cadena después de que se ejecuta en el lado de SQL:

(
select new { Username = u.Username, 
    PostingDate = c.Date 
    [...] 
}) 
.ToList() // runs on SQL and returns to the application 
.Select(o => // is not generating a SQL, it is running on the app 
    new Post { Username = o.Username, 
     PostingDate = o.PostingDate.ToString(), 
     [...] 
    }) 
2

puede resolver su problema al proyectar en un tipo anónimo, y luego en un proyecto de paso posterior en Post después de que los datos ya hayan sido devueltos por el DB.

(from .... 
select new { /* stuff */, Date = c.Date }) 
.AsEnumerable() 
.Select(p => new Post { /* stuff */, PostingDate = p.Date.ToString() }) 
.ToList(); 

Sin embargo, dado que tiene una propiedad llamada PostingDate, la fuente original siendo una fecha, recomendaría su Revisar el objeto en realidad mantener el valor como DateTime lugar de una cadena.

+0

Creo que eso es lo que haré, hacer que PostingDate sea del tipo DateTime. Quería evitar que el cliente tuviera que realizar el formato de fecha, pero parece que no puede ser ayudado en este caso. – Ronald

0

No creo que esto se pueda hacer de manera directa.

var list =  
    select new Post { Username = u.Username, PostingDate = SqlFunctions.StringConvert(c.Date), Data = c.Comment } 
from 
(from c in db.TitleComments 
    join t in db.Titles on c.TitleId equals t.Id 
    join u in db.Users on c.UserId equals u.Id 
    where t.Id == _titleId && c.Date > time 
    orderby c.Date descending).AsEnumerable() 
    ).ToList(); 

También con EF4 puede intentar algo como esto:

List<Post> list = 
(
from c in db.TitleComments 
join t in db.Titles on c.TitleId equals t.Id 
join u in db.Users on c.UserId equals u.Id 
where t.Id == _titleId && c.Date > time 
orderby c.Date descending 
select new Post { Username = u.Username, PostingDate = SqlFunctions.DateName(c.Date), Data = c.Comment } 
).ToList();