【发布时间】:2016-04-06 18:34:43
【问题描述】:
嗨,我在控制器中有这段代码,这可以很好地转换 Fecha 属性的日期格式
var com = db.Comentario
.Where(co => co.IdProducto == id)
.OrderByDescending(c => c.Fecha)
.Skip((int)offset)
.Take(2)
.ToList()
.Select(c => new {
c.Id,
Usuario = new {
c.Usuario.Nombre,
c.Usuario.Apellidos,
c.Usuario.Avatar,
c.Usuario.Nickname
},
c.Contenido,
Fecha = c.Fecha.ToShortDateString(), //it works fine
R = c.IdEstado == 1 ? false : true
});
但是...问题出在另一个控制器上
db.Comentario.Add(com);
db.SaveChanges();
var resp = db.Comentario
.Where(c => c.Id == com.Id)
.Select(c => new {
c.Id,
Usuario = new {
c.Usuario.Nombre,
c.Usuario.Apellidos,
c.Usuario.Avatar,
c.Usuario.Nickname
},
c.Contenido,
Fecha = c.Fecha.ToShortDateString(),//the problem is here
R = c.IdEstado == 1 ? false : true
}).FirstOrDefault();
在这里我向数据库插入了一个 Commentario 对象,我想以 JSON 结果返回该对象,但出现此错误
LINQ to Entities 无法识别方法“System.String ToShortDateString()”方法,并且该方法无法转换为存储表达式。
如果两者是相同的代码,我无法理解为什么代码会失败。 谢谢
【问题讨论】:
-
在幕后,这些代码片段被不同地解析和处理。第一段代码在
Take()ToList()操作之后对 DB 执行查询,然后您正在对生成的List项执行Select。此时,您将 Linq 用于可枚举的对象。在第二个代码集中,FirstOrDefault之前的所有内容都被翻译为 SQL,而 Linq to Entities 不知道如何处理ToShortDateString(),因为它没有翻译。 -
不要格式化查询中的日期。让 UI 决定如何显示日期。您不会将
ToShortDateString()附加到您将发送到用户界面的每个日期,是吗? -
是的,但是当我发送不带格式的日期时,我得到了“\Date(321654879)/”,我想这是一个 unix 日期,但是当我转换它时,我得到一个不正确的日期
-
是的,这就是 JSON 序列化默认的方式。我没有说这是微不足道的,但仍然是要走的路。有时您想显示带有时间分量的日期,有时不显示日期,或者您想在需要日期的数据选择器中编辑它们。或者您希望客户文化决定日期的显示方式! Moment.js 在这里有很大的帮助。
标签: c# entity-framework linq lambda