如何在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”?的主要内容,如果未能解决你的问题,请参考以下文章

根据需要在LINQ查询分配对象中设置日期格式

猫鼬如何在模型中设置日期格式

如何在与 SQL 的连接中设置日期格式?

如何在 AG-Grid 中配置日期渲染格式

在变量中设置日期格式

如何在 Oracle SQL Developer 中设置自定义日期时间格式?