2016-02-28 61 views
0

我想知道是否有可能在Linq查詢中轉換DateTime對象的時區。例如如何在Linq中將DateTime對象轉換爲本地/ UTC時區?

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

在上面的代碼,x.StartTime是在UTC時區而x.Creation時間是在本地時區。如果我在x.CreationTime上致電ToUniversalTime()我收到一個異常。 是否可以在Linq查詢中進行轉換? 我知道可以在查詢之前提取CreationTime並將其轉換,但知道將其轉換爲Linq隊列中的可能性會很好。

+0

你會得到什麼例外? '_seat.GetAll()'從數據庫中拉出來嗎? –

+0

代碼中出現'DbFunctions'表示您正在使用實體框架。真的嗎?您的問題的答案將特定於將LINQ查詢轉換爲SQL的LINQ提供程序。 –

+2

有幾個問題:1)這個實體框架? 2)這是SQL Server還是其他? (以及哪個版本?)3)數據庫中的「StartTime」和「CreationTime」是什麼類型的字段? 4)*爲什麼*你在'CreationTime'字段中存儲當地時間? 5)*當地時間是誰 - 用戶的?一個Web服務器的?數據庫服務器的? 6)你確實意識到你的查詢是[non-sargable](https://en.wikipedia.org/wiki/Sargable),對不對? –

回答

0

由於@MartinLiversage列中解釋了最好的解決辦法如下:

您可以輕鬆地拉所有行到客戶端解決你的問題,然後使用您的謂詞進行過濾(撇開使用「本地時間」創建的問題)。但是,我假設您要過濾數據庫服務器上的記錄。 EF將不得不將您的謂詞翻譯成相應的SQL,這會限制您可以在Where子句中執行的操作。 DbFunctions是一種聲明EF可以轉換爲SQL的某些簡單計算的方法,但無法執行時區轉換。 SQL Server沒有時區的概念。

而作爲@Martine提及以下可以考慮considertion:

的SQL Server 2016剛剛添加的時區支持。但是,AFAIK還沒有EF DbFunctions。不過,這裏可能不是一個好用法。

相關問題