考虑我的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。
在某些类型和最近的 DateTime 之前,我遇到过“没有支持的 SQL 转换”问题。但是我上面的测试和这个链接证明在 SQL 翻译中应该支持 AddHours 方法。
如果有人能告诉我我在这里做错了什么(或解决此问题的不同解决方法),我将不胜感激。