如何在linq中设置日期格式“yyyy-MM-dd hh:mm”?
Posted
技术标签:
【中文标题】如何在linq中设置日期格式“yyyy-MM-dd hh:mm”?【英文标题】:How to set date format "yyyy-MM-dd hh:mm" in linq? 【发布时间】:2016-03-16 11:15:57 【问题描述】:这是我的代码:
var qry = (from u in _db.ApplicationUsers
select new UserBroadcastDTO()
UserId = u.Id,
DateCreated = u.DateCreated
).OrderByDescending(q => q.DateCreated);
我有这个例外:
LINQ to Entities 无法识别方法“System.String ToString(System.String)”方法,并且该方法无法转换为存储表达式。
如何在 linq 中转换日期格式?
【问题讨论】:
返回一个DateTime
并让表示层处理格式化。
格式化时,不要在没有 AM/PM 指示符的情况下使用 hh
... 使用 HH
24 小时。
我还建议使用 h
而不是 hh
,这样您就不会在 1-9 小时内得到填充零,但这只是我的偏好。
ToString 不像你想象的那样工作。 msdn.microsoft.com/en-us/library/…
【参考方案1】:
您的问题是格式不属于 Linq 查询本身。查询与数据有关,而不是表示。
现在,如果您尝试将查询结果投影到某个东西中以供显示,那么请确保在进行格式化之前枚举集合。您可以调用 .ToList(),但在大多数情况下,只需添加一个 .AsEnumerable() 即可解决问题,在 可以 成为 SQL 的一部分(或其他后端存储)查询,什么不能。然后,添加另一个选择来进行投影。
像这样:
var qry = _db.ApplicationUsers
.OrderByDescending(q => q.DateCreated)
.AsEnumerable()
.Select new UserBroadcastDTO
UserId = u.Id,
DateCreated = u.DateCreated.ToString("yyyy-MM-dd hh:mm")
);
如果需要,.AsEnumerable 调用可以是 .ToList,但 .AsEnumerable 可以正常工作,并且在需要时仍会推迟执行,但重要的是您要停止它从成为 IQueryable 开始,因此在此之后的任何内容都不会尝试进入 SQL 查询,并且您不会收到错误。
【讨论】:
【参考方案2】:发生这种情况是因为 LINQ to Entities 正在尝试将表达式树转换为 SQL 查询,而 .ToString(string)
无法转换为 SQL。您应该在表示层中处理结果,例如在 MVC 应用程序的视图中:
@Model.DateCreated.ToString("yyyy-MM-dd hh:mm")
【讨论】:
【参考方案3】:ypu 需要具体化查询,以便在 linq to objects linq to entity 中可能发生这种情况
var qry = _db.ApplicationUsers.OrderByDescending(q => q.DateCreated)
.Select(u => new UserBroadcastDTO
UserId = u.Id,
DateCreated = u.DateCreated
);
// do your additional logic then materialize the query
var formattedresults = qry.ToList().Select(q => new UserBroadcastDTO
UserId = q.Id,
DateCreated = q.DateCreated.ToString("yyyy-MM-dd hh:mm")
);
【讨论】:
以上是关于如何在linq中设置日期格式“yyyy-MM-dd hh:mm”?的主要内容,如果未能解决你的问题,请参考以下文章