【问题标题】:Changing a DateTime to use UTC in a LINQ to Entity IQueryable anonymous type更改 DateTime 以在 LINQ to Entity IQueryable 匿名类型中使用 UTC
【发布时间】:2018-02-16 07:46:01
【问题描述】:

我正在使用 LINQ to Entity 查询并返回匿名类型。日期值以 UTC 格式存储在数据库中,因此在将日期值的结果返回给客户端时,我需要将其格式化为 UTC。为此,我使用Date.ToString("u")将结果格式化为UTC。唯一的问题是,当在 LINQ 查询中使用 ToString 时,它会失败,因为没有等效的命令可以在 SQL 中转换它。如何使用 LINQ to Entity 以 UTC 格式返回查询结果?这是我的查询示例:

Return _db.WorkOrders.Include("Client").Include("Warehouse")
    .OrderByDescending(Function(wo) wo.Date)
    .Where(Function(w)
    (w.Status = WorkOrder.WorkOrderStatus.Submitted)
    .Select(Function(wo) New With {.Client = wo.Client.Name, 
    .Date = wo.Date.ToString("u"), .Warehouse = wo.Warehouse.Name, .Status = wo.Status.ToString})
    .ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter)

wo.Date.ToString("u") 上的查询失败,因为 SQL 中没有等效方法。

【问题讨论】:

  • 你试过wo.Date.ToUniversalTime().ToString()吗?
  • @DanielShillcock 我不能在 LINQ 查询中使用这些函数,因为没有等效的 SQL,所以 .NET 不知道如何处理它。见link
  • 首先使用 ToList() 将您的列表具体化,然后投影到您的匿名对象中。使用 ToList() 后,您将拥有所有对象,并且您的 ToString() 将得到支持,因为您使用的是 LINQ to Object 而不是 SQL。

标签: asp.net vb.net entity-framework linq-to-entities


【解决方案1】:

在 LINQ to Entities 中肯定不支持 ToString() 方法 - 没有等效的 SQL 可以将 DateTime 转换为字符串。可用的SqlFunctions 中有GetUtcDate 用于UTC 转换,但不存在DateTimestring 的转换方法。

您可以尝试使用ToListAsEnumerable 首先在内存中实现查询结果,使用LINQ to Objects 执行DateTime 到UTC 字符串转换,然后使用AsQueryable 还原,从而生成IQueryable 对象使用ToDataSourceResult 如下所示:

Return _db.WorkOrders.Include("Client").Include("Warehouse")
       .OrderByDescending(Function(wo) wo.Date)
       .Where(Function(w) (w.Status = WorkOrder.WorkOrderStatus.Submitted)
       .ToList()
       .Select(Function(wo) New With {
           .Client = wo.Client.Name, 
           .Date = wo.Date.ToUniversalTime().ToString(), 
           .Warehouse = wo.Warehouse.Name, 
           .Status = wo.Status.ToString() 
           })
       .AsQueryable() ' since ToDataSourceResult requires IQueryable, this should be added
       .ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2023-04-08
    • 2012-08-12
    相关资源
    最近更新 更多