【问题标题】:How to convert a DateTime object to Local/UTC Timezone in Linq?如何在 Linq 中将 DateTime 对象转换为本地/UTC 时区?
【发布时间】:2016-06-11 15:49:22
【问题描述】:

我想知道是否可以在 Linq 查询 中转换 DateTime 对象的时区。例如

var seats = await _seat.GetAll()
                    .Where( 
                       DbFunctions.AddHours( x.StartTime, -1 ) >= x.CreationTime.ToUniversalTime());

在上面的代码中,x.StartTime 是 UTC 时区,而 x.Creation 时间是 local 时区。如果我在 x.CreationTime 上调用 ToUniversalTime() 我会遇到异常。 是否可以在 Linq 查询中进行转换? 我知道可以在查询之前提取 CreationTime 并对其进行转换,但如果知道在 Linq qurt 中进行转换的可能性存在,那就太好了。

【问题讨论】:

  • 你得到什么异常? _seat.GetAll() 是否从数据库中提取?
  • 您的代码中出现DbFunctions 表明您正在使用实体框架。真的吗?您的问题的答案将特定于将 LINQ 查询转换为 SQL 的 LINQ 提供程序。
  • 几个问题:1)这是实体框架吗? 2) 这是 SQL Server 还是别的什么? (以及什么版本?) 3) 数据库中的StartTimeCreationTime 是什么字段类型? 4) 为什么您将本地时间存储在CreationTime 字段中? 5) 谁的当地时间是 - 用户的?网络服务器的?数据库服务器的? 6) 你知道你的查询是non-sargable,对吧?
  • @BJMyers 我收到此异常:** LINQ to Entities 无法识别方法 'System.DateTime ToUniversalTime()' 方法,并且此方法无法转换为商店表达式。 **
  • @MartinLiversage 正确,我使用的是实体框架。我不确定我是否理解您的意思:“您的问题的答案将特定于将 LINQ 查询转换为 SQ 的 LINQ 提供程序”

标签: c# linq datetime timezone


【解决方案1】:

正如@MartinLiversage 在专栏中解释的那样,最佳解决方案如下:

您可以通过将所有行拉到客户端轻松解决您的问题,然后使用您的谓词执行过滤(撇开使用“本​​地时间”创建的问题。)但是,我假设您想要过滤数据库服务器上的记录。 EF 必须将您的谓词转换为相应的 SQL,这限制了您在 Where 子句中可以执行的操作。 DbFunctions 是一种声明某些简单计算的方法,EF 可以将这些计算转换为 SQL,但无法执行时区转换。 SQL Server 没有时区的概念。

正如@Martine 提到的,可以考虑以下几点:

SQL Server 2016 刚刚添加了时区支持。但是,AFAIK 还没有适用于它们的 EF DbFunctions。不过,这里可能不是很好的用法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2012-09-22
    • 2013-09-12
    • 1970-01-01
    • 2011-09-27
    • 2019-05-31
    相关资源
    最近更新 更多