2012-07-09 190 views
1

我有一個誤區之二串:LINQ到實體比較Where子句

LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression.

的一段代碼:

plist= plist.Where(p => Convert.ToInt(p.Period) >= syslockPeriod); 

p.Period例如:201206

的plist是IQueryable。 p.Period是字符串類型。 sysLockPeriod是int。

如何解決?

+2

你不能在linq2entities中使用Convert.ToInt ...。順便說一句,爲什麼Period是一個字符串,如果它是一個int? – 2012-07-09 07:25:24

+0

它不是int,因爲在Sql Server數據庫中最初Period是字符串類型。我不知道爲什麼它不是一個整數)) – loviji 2012-07-09 07:27:45

+0

那麼,我必須是一個int,可以更改爲Sql Server中的int,也許? – 2012-07-09 07:30:58

回答

0

LINQ到實體會嘗試Convert.ToInt32()轉化爲SQL指令,因爲它不是的方法可以翻譯那麼它就會產生錯誤之一。

你有一些解決方法,但是他們都必須改變你的代碼。讓我們看看你能做什麼(按照優先順序,對我來說)。

  • Period屬性/字段轉換爲正確的類型。如果它是一個整數類型,那麼爲什麼你把它作爲一個字符串存儲在你的數據庫?
  • 創建一個函數(在您的數據庫中)執行轉換並使用計算的屬性(或視圖)。 LINQ to Entities現在將有一個真正的列的正確類型(不需要轉換)或函數來調用(在SQL一側)進行轉換。在MSDN上查看關於how to call custom database functions的示例。
  • 轉換IQueryableIListToList()Where()之前,現在where條款將在本地,而不是在數據庫上(這可能是什麼可怕的事情做,如果該列表是相當大的)執行。
+0

好的,我和你一起玩。但我能做些什麼知道解決它? – loviji 2012-07-09 07:28:56

+0

第三種解決方法對我來說不好,因爲它會從數據庫接收更多的信息給應用程序。現在有一個問題,是否有可能改變實體模型的類型? – loviji 2012-07-09 08:05:19

+0

@loviji不,它不是(即使你添加一個自定義屬性,你不能在查詢中使用它)。但是,如果您有一個無法更改的現有數據庫,則可以在視圖上工作(然後可以使用函數執行轉換)。但我更喜歡使用自定義函數,這是一個更清晰的解決方案(您甚至可以將原始屬性聲明爲private,右鍵單擊爲public,並調用其中的db函數)。 – 2012-07-09 08:11:29

0

不要將syslockPeriod轉換爲LINQ查詢外的字符串。這將有助於擺脫錯誤(如果您還刪除了「Convert.ToInt」),但會返回錯誤的結果。這會給出「真實」的結果:"12" < "2"

正確的解決方案是將字符串列「Period」轉換爲整數列。

0

這是LINQ中的一個常見問題,因爲你不能在LINQ表達式中使用正常的函數。 (這允許LINQ進行懶惰評估並減少調用函數時可能發生的與狀態相關的問題)。幸運的是,我們可以通過創建一個業務對象來處理這個問題,在訪問器中爲你做轉換,或者使用Linq to SQL來轉換它。

我更喜歡前者,因爲創建業務對象是一種很好的做法,因爲它鼓勵重用。

查看http://mosesofegypt.net/post/LINQ-to-Entities-Workarounds-on-what-is-not-supported.aspx的優秀帖子樣本。