Asp.net 将日期时间更改为在LINQ到实体IQueryable匿名类型中使用UTC

Asp.net 将日期时间更改为在LINQ到实体IQueryable匿名类型中使用UTC,asp.net,vb.net,entity-framework,linq-to-entities,Asp.net,Vb.net,Entity Framework,Linq To Entities,我使用LINQ到实体查询并返回一个匿名类型。日期值以UTC格式存储在数据库中,因此在将日期值返回给客户端时,我需要将日期值的结果格式化为UTC。为此,我使用Date.ToString(“u”)将结果格式化为UTC。唯一的问题是在LINQ查询中使用ToString时失败,因为在SQL中没有等效的命令来转换它。如何使用LINQ to Entity以UTC格式返回查询结果?以下是我的查询示例: Return _db.WorkOrders.Include("Client").Include("Wareh

我使用LINQ到实体查询并返回一个匿名类型。日期值以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中没有等效的方法。

当然
ToString()
方法在LINQ to Entities中不受支持-没有将
DateTime
转换为字符串的SQL等效方法。可用的
SqlFunctions
中没有UTC转换,但不存在
DateTime
string
的转换方法

您可以尝试使用
ToList
AsEnumerable
首先在内存中具体化查询结果,使用LINQ to Objects执行
DateTime
到UTC字符串的转换,然后使用
AsQueryable
返回,结果是
IQueryable
对象要使用,如下所示:

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)

您是否尝试过
wo.Date.ToUniversalTime().ToString()
?@danielshillock我无法在LINQ查询中使用这些函数,因为没有SQL等价物,因此.NET不知道如何处理它。请参见首先使用ToList()将列表具体化,然后投影到匿名对象中。使用ToList()后,您将拥有所有对象,并且您的ToString()将受到支持,因为您使用的是LINQ to object而不是SQL。