2017-04-18 32 views
0

我有一個名爲EndDate的DateTime?列的sql-server-ce 4數據庫。當我刪除一條記錄時,我設置了這個結束日期,當我想要檢索一個記錄列表時,我想通過在enddate上應用一個過濾器來過濾所有刪除的記錄。將linq中的DateTime與sql server ce進行比較的最簡單方法是什麼?

我使用實體框架通過linq應用此過濾器。

我的LINQ查詢看起來是這樣的:

protected IDbSet<TEntity> Entities; 
... 
Entities.AsNoTracking().AsQueryable() 
    .Where(entity => !entity.EndDate.HasValue || entity.EndDate.Value > DateTime.UtcNow); 

當我執行這個LINQ查詢我得到以下錯誤:

The function 'CurrentUtcDateTime' is not supported by SQL Server Compact.

搜索這個錯誤告訴我,(如果我的理解是正確)我不能使用DateTime.UtcNow。

我的問題是:有什麼方法可以達到我想要達到的目標?

有沒有不同的功能,我可以通過linq使用?或者我應該使用更原始的解決方案,我也將日期時間轉換爲時代並比較這些?

+1

你現在試過'var now = DateTime.UtcNow;'然後'... entity.EndDate.Value>;'? – Igor

+0

entity.EndDate.Value.ComparetTo(otherDate)lookup CompareTo – kblau

+0

謝謝伊戈爾,這沒有把戲。我以爲我嘗試過,但我想我沒有。我仍然想知道爲什麼一個變種被接受,而一個財產不是?有任何想法嗎? – Cornelis

回答

0

的問題是,因爲它是IQueryable狀態,這意味着它尚未執行,並製作成具體數據的過程可以使用代碼示例操作是不是本地的操作。這允許通過其他操作(如另一個Where子句)來調整查詢,如果需要的話。

一旦數據被實際查詢,Linq創建SQL來完成該任務併發送到數據庫,並且該SQL無法確定UTC.Now是什麼。

一個客戶的選擇是使數據混凝土,通過將其擊落,然後過濾出來,如:

Entities.AsNoTracking().ToList() 
         .Where(entity => !entity.EndDate.HasValue 
              || entity.EndDate.Value > DateTime.UtcNow); 

這將工作通過ToList availble的製作到運行時的數據。成本當然會降低客戶端中的所有值。如果那是小的話,如果它是成千上萬的記錄,那就很好;不建議。


否則數據庫的選擇是創建一個存儲過程,以降低所需的記錄,或添加返回boolean爲所需要的測試(S)計算列字段。

相關問題