我有一個類型爲varchar
的列的表,其中大多數行具有數值查看值,也就是說,每個字符串只包含數字0通過9.使用MySQL適配器將字符串轉換爲長...在LINQ to Entity Framework中使用MySQL適配器
+------+ | n | +------+ | 123 | | 234 | | BLAH | -- This row is an exception to the rule. | 456 | | 789 | +------+
在MySQL,這工作:SELECT * FROM t WHERE n >= 200 AND n <= 500;
返回與其中n
具有234的值,並且還行456爲上述的數據。
我希望能夠使用LINQ與實體框架做同樣的事情。
var results = from n in context.t
let n_asLong = long.Parse(n) // ...I know, see note below...
where (n != null && n_asLong >= lowVal && n_asLong <= hiVal)
select n_asLong;
-
注意:是的,我知道,當它到達無效數字
long.Parse()
會拋出異常。目前我的實際樣本數據只包含合法的可解析字符串。我列入了一個非數字項目,希望得到一個完整的,全面的答案。
運行該代碼產生關於LINQ編碼異常:
LINQ實體無法識別方法「的Int64解析(系統string)方法,並且這種方法不能被翻譯成商店表達。
我明白爲什麼,它想要在SQL中進行轉換。
事實上,我用MS-SQL進行了一個實驗,並且必須導出一個自定義的字符串到長整型函數,它知道壞數據(對於非數字值,例如'BLAH'返回0),並且工作正常與LINQ to SQL,儘管這是一個比我想要更復雜的解決方法。
但事實證明,我被鎖定在MySQL解決方案中。所以上述供應商特定的黑客行爲將不起作用。
我不禁想那裏有是一種將字符串視爲值的方式(因爲即使是本機SQL也允許),並且可以通過LINQ to Entity Frameworks來實現。
來自某些數據庫/ C#/ .NET/LINQ專家的任何優秀方法?
如果有必要,我願意爲可恥的執行原始SQL直接解決方案,如果沒有其他人存在踢。
好主意,但沒有奏效。 使用LINQ to Entities會導致一個NotSupportedException:LINQ to Entities不能識別方法'Int64 ToInt64(System.String)'方法,並且此方法不能轉換爲存儲表達式。 我覺得這個版本的實體框架是腦死亡。 – 2010-07-08 19:51:59
謝謝,你的回答幫助我解決了Linq to SQL中的類似問題... – 2012-08-24 12:50:31