【发布时间】:2010-10-11 05:02:27
【问题描述】:
考虑我的Event 类,我将DateTime 存储在数据库中作为UTC 日期。我只是想根据特定时区的当前日期返回过滤范围 - 很简单吧?
这很好用:
IQueryable<Event> test1 = this.GetSortedEvents().Where(e => e.FinishDateTime.Date >= DateTime.UtcNow.Date);
这也很好用:
IQueryable<Event> test2 = this.GetSortedEvents().Where(e => e.FinishDateTime.AddHours(3).Date >= DateTime.UtcNow.AddHours(3).Date);
.. 并且还符合我的时区要求。
所以在这里我想我可以将这个特定的转换移到这个扩展方法中:
public static DateTime RiyadhTimeFromUtc(this DateTime utcTime) { return utcTime.AddHours(3); }
这不起作用:
IQueryable<Event> test3 = this.GetSortedEvents().Where(e => e.FinishDateTime.RiyadhTimeFromUtc().Date >= DateTime.UtcNow.RiyadhTimeFromUtc().Date);
.. 我得到这个 NotSupportedException: Method 'System.DateTime RiyadhTimeFromUtc(System.DateTime)' has no supported translation to SQL.
这显然是垃圾,因为当扩展方法中没有相同的代码时,编译器很乐意将其转换为 SQL。
我之前遇到过“不支持对 SQL 的转换”的问题,其中某些类型是最近的 DateTime 类型。但是我上面的测试和this link证明SQL翻译应该支持AddHours方法。
如果有人能告诉我我在这里做错了什么(或解决此问题的不同解决方法),我将不胜感激。
【问题讨论】:
标签: sql linq-to-sql datetime extension-methods utc