2017-04-27 78 views
-1

我正在創建一個WPF C#應用程序,允許您添加,刪除和編輯汽車租賃訂單,我試圖實現一項功能,只從數據庫中選擇完成的記錄,或選擇仍處於活動狀態的記錄。如何僅顯示SystemDate小於/大於存儲日期的數據庫記錄?

這是我excample ShowCompleted方法....

DateTime current = DateTime.Now; 
      var query = from CarRental in this.dbContext.CarRentals where (CarRental.Starting_Date.AddDays(CarRental.Duration)) < current select CarRental; 
      this.CarRentalViewSource.Source = query.ToList(); 

這是錯誤當我點擊該按鈕,我得到了,我不知道解決的辦法是什麼?

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll 

Additional information: LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression. 

任何幫助,將不勝感激

感謝

傑米·

+0

你是不是比較與存儲的日期,你* *計算使用C#方法,'AddDays'它。這不能轉換爲SQL。這就是消息所說的 –

+1

另一個問題是,通過*計算*日期,即使您在SQL中這樣做,您也可以防止服務器使用涵蓋'Starting_Date'的任何索引。這將強制進行全表掃描。創建一個實際的或持久化的calcualted字段'Ending_Date'並將其添加到索引。 –

回答

0

EntityFramework翻譯所有功能sql,錯誤是說EntityFramework無法翻譯DateTime.AddDays功能爲sql。您需要使用DbFunctions.AddDays代替DateTime.AddDays,使你的代碼看起來應該是這樣

DateTime current = DateTime.Now; 
var query = from CarRental in this.dbContext.CarRentals where 
      (DbFunctions.AddDays(CarRental.Starting_Date, CarRental.Duration))) < current select CarRental; 
this.CarRentalViewSource.Source = query.ToList(); 
+1

即使*那*不是一個好主意,因爲它阻止服務器使用涵蓋'Startging_Date'字段的任何索引。這將工作,但導致全表掃描 –

+0

@PanagiotisKanavos是的,你是對的。但是我沒有其他的方法可以解決這個問題。另一種解決方案是將已經計算的日期和查詢存儲在該列中,這在上面的註釋中已經提到) –

+0

@Ruben,你確定這是最新的代碼嗎?它似乎產生更多的錯誤,而不是修復它們 –

相關問題