【问题标题】:How to set date format "yyyy-MM-dd hh:mm" in linq?如何在linq中设置日期格式“yyyy-MM-dd hh:mm”?
【发布时间】: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/…

标签: c# entity-framework linq


【解决方案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")
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        相关资源
        最近更新 更多