asp.net-mvc - route - input asp for
LINQ convierte DateTime a cadena (3)
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, PostingDate = c.Date.ToString (). ¿Alguna idea de cómo evitar esto?
Error de excepción: {"LINQ to Entities no reconoce el método ''System.String ToString ()'', y este método no se puede traducir a una expresión de tienda."}
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 puedes probar 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();
Puede solucionar su problema proyectándolo en un tipo anónimo, y luego en un proyecto 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 es una fecha , le recomendaría que revise su objeto para mantener el valor como DateTime
lugar de cadena.
linq está tratando de convertir la fecha en cadena usando sql, pero como no hay un método ToString () en sql, no puede convertirlo, este comportamiento es por diseño . Joakim
En otras palabras, devuelva la fecha y conviértala en una cadena después de que se ejecute en 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(),
[...]
})