更改 DateTime 以在 LINQ to Entity IQueryable 匿名类型中使用 UTC
Changing a DateTime to use UTC in a LINQ to Entity IQueryable anonymous type
我正在使用 LINQ to Entity 查询和 returning 匿名类型。日期值以 UTC 格式存储在数据库中,因此当 return 将其发送给客户端时,我需要将日期值的结果格式化为 UTC。为此,我使用 Date.ToString("u")
将结果格式化为 UTC。唯一的问题是,在 LINQ 查询中使用 ToString
时会失败,因为在 SQL 中没有等效的命令来转换它。如何使用 LINQ to Entity return 我的 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 中没有等效方法。
当然,LINQ to Entities 不支持 ToString()
方法 - 没有 SQL 等同于将 DateTime
转换为字符串。在可用的 SqlFunctions
中有 GetUtcDate
用于 UTC 转换,但不存在 DateTime
到 string
的转换方法。
您可以尝试使用 ToList
或 AsEnumerable
先在内存中具体化查询结果,使用 LINQ to Objects 执行 DateTime
到 UTC 字符串转换,然后使用 [=20 还原=] 结果 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)
我正在使用 LINQ to Entity 查询和 returning 匿名类型。日期值以 UTC 格式存储在数据库中,因此当 return 将其发送给客户端时,我需要将日期值的结果格式化为 UTC。为此,我使用 Date.ToString("u")
将结果格式化为 UTC。唯一的问题是,在 LINQ 查询中使用 ToString
时会失败,因为在 SQL 中没有等效的命令来转换它。如何使用 LINQ to Entity return 我的 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 中没有等效方法。
当然,LINQ to Entities 不支持 ToString()
方法 - 没有 SQL 等同于将 DateTime
转换为字符串。在可用的 SqlFunctions
中有 GetUtcDate
用于 UTC 转换,但不存在 DateTime
到 string
的转换方法。
您可以尝试使用 ToList
或 AsEnumerable
先在内存中具体化查询结果,使用 LINQ to Objects 执行 DateTime
到 UTC 字符串转换,然后使用 [=20 还原=] 结果 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)