【问题标题】:UTC to local time using Linq to EntitiesUTC 到本地时间使用 Linq to Entities
【发布时间】:2010-10-04 16:29:54
【问题描述】:

我需要在 LINQ to Entities 查询中将字段从 UTC 转换为本地时间。但它无法识别我打算使用的方法“System.DateTime ToLocalTime”。

我的查询是这样的:

选择本地当天不存在任何其他请求但尚未解决的请求。考虑到 IncommingDateTime 存储在 UTC 中,这就是查询。

from r in Requests
where Request.Count(x => x.IncommingDateTime.ToLocalTime().Date == r.IncommingDateTime.ToLocalTime().Date 
&& x.Resolved == false ) = 0
select r

我将不胜感激。

【问题讨论】:

    标签: c# .net linq-to-entities


    【解决方案1】:

    您希望使用哪个时区?默认情况下,数据库真正知道的唯一可能是它自己的。

    请注意,DateTime.Day 仅代表一个月中的某一天 - 您希望 6 月 10 日和 7 月 10 日算作同一天吗?

    如果您能算出您真正感兴趣的时区,那可能是一个潜在的解决方案——尽管我不想保证。这可能是实际上存储本地日期和时间以及时区而不是 UTC 日期/时间的情况之一。 (如果与其他值相比,本地日期/时间实际上比所表示的时刻更重要,则这是合适的。)

    【讨论】:

    • 谢谢乔恩。您对 DateTime.Day 属性是正确的。我希望服务器现在将使用自己的本地时间(我稍后会更改它以使用特定的时区)。而且,关于数据库,我别无选择以 UTC 存储。
    • @ViBela:当您说“服务器”时 - 涉及两台服务器:一台运行 .NET 代码和数据库。目前它们实际上可能是同一个盒子,但你应该清楚你在说哪个逻辑 :)
    【解决方案2】:

    为了能够使用不转换为 SQL 的函数,您需要具体化表。

    var materializedRequests = Requests.Where(x => !x.Resolved).ToList(); //Materialize list with a ToList call
    
    materializedRequests
        .Where(x =>
            !materializedRequests.Any(y => 
                y.IncommingDateTime.ToLocalTime().Day == x.IncommingDateTime.ToLocalTime().Day
            )
        )
    

    然后你可以使用几乎任何你想要的功能。然而,实现列表是一个非常昂贵的调用。在具体化之前尝试尽可能多地过滤列表。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多