1

我有一個類型爲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直接解決方案,如果沒有其他人存在踢。

回答

1

結束了踢球。

似乎認爲實體框架,認爲它只與對象一起工作,希望始終進行強類型檢查,但同時沒有在SQL中進行比較的類型之間進行轉換的機制。令人震驚的是,即使CONVERT("1234", UNSIGNED),MySQL提供,也不能被編碼,更少的解決方案,Int64.Parse()

通過MySqlConnection/MySqlCommand/MySqlDataReader結束訪問原始SQL。

3

您可以使用「轉換」,提供商可以翻譯。

var results = from n in context.t 
       let n_asLong = Convert.ToInt64(n) // -- Here is the magic 
       where (n != null && n_asLong >= lowVal && n_asLong <= hiVal) 
       select n_asLong; 

(至少它的工作我使用SQL Server Express和LINQPad的)

+1

好主意,但沒有奏效。 使用LINQ to Entities會導致一個NotSupportedException:LINQ to Entities不能識別方法'Int64 ToInt64(System.String)'方法,並且此方法不能轉換爲存儲表達式。 我覺得這個版本的實體框架是腦死亡。 – 2010-07-08 19:51:59

+0

謝謝,你的回答幫助我解決了Linq to SQL中的類似問題... – 2012-08-24 12:50:31