2010-10-04 51 views
1

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

我的查询是这样:

对于不存在于同日在当地尚未解决任何其他请求,选择请求。考虑到IncommingDateTime存储在UTC中,这是查询。

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

我会很感激任何帮助。

回答

1

您期望使用哪个时区?数据库唯一默认知道的唯一一个可能是它自己的。

请注意,DateTime.Day只表示当月的某一天 - 您是否希望6月10日和7月10日算作同一天?

如果您可以计算出您真正感兴趣的时区,那可能意味着可能的解决方案 - 尽管我不想保证它。这可能是其中实际上这是有意义的存储本地日期和时间,以及时区,而不是UTC日期/时间。 (如果本地日期/时间实际上比所表示的瞬间更重要,则与其他值相比,这是适当的。)

+0

谢谢乔恩。您对DateTime.Day属性是正确的。我预计服务器现在会使用它自己的本地时间(稍后我会更改它以使用特定的时区)。而关于数据库,我没有选择以UTC存储。 – 2010-10-04 16:58:36

+0

@ViBela:当你说“服务器”时 - 有两台服务器:运行.NET代码和数据库的服务器。他们现在可能实际上是同一个盒子,但是你应该清楚你的想法是哪一个逻辑*你正在谈论的:) – 2010-10-04 17:03:33

1

要能够使用不转换为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 
     ) 
    ) 

然后你可以使用几乎所有你想要的功能。但是,实现清单是一个非常昂贵的调用。尝试在实现它之前尽可能多地过滤列表。