2016-09-26 61 views
0

在我的數據庫中我有這個字段:mySerial Double?
我有一個Multicritera搜索,我必須搜索這個字段。
用戶想要在該字段上搜索輸入開始,結束或他們想要的任何內容。Linq Double包含

所以我這樣做:

results.Where(x => x.mySerial.ToString().Contains(TextBox_mySerial.Text)) ; 

當我搜索 「88890」
我應該有:888900,888901,888903,888908,888909作爲結果。
但 我只得到:888889

的LINQ把.ToString().Contains我到:

WHERE CONVERT(NVARCHAR(30), [t0].[mySerial], 2) LIKE '%88890%' 

但我想要的是:

WHERE [mySerial] LIKE '%88890%' 

有沒有辦法在LINQ to實現這一目標或做我必須在我的視圖中投入[mySerial]到一個varchar?

+1

我並不感到驚訝。我一直認爲地獄中有一個特殊的地方,像我這樣的人.ToString()。包含()一個int或一個double。 –

+1

如果你運行一個查詢並選擇'CONVERT(NVARCHAR(30),[mySerial],2)'你會得到什麼結果?根據文檔2的風格會給科學記數法,所以我想知道這是否會讓你感到困惑。剛試過'SELECT CONVERT(NVARCHAR(30),CAST(888889 AS FLOAT),2)',結果是8.888890000000000e + 005。所以也許先嚐試投射到'int'? – juharr

+0

不知道這是否會工作,但如果您嘗試'((字符串)x.mySerial).Contains(TextBox_mySerial.Text)''會發生什麼? – juharr

回答

3

問題是Linq使用2的風格進行轉換,導致科學記數法。所以下面的查詢

SELECT CONVERT(NVARCHAR(30), CAST(888900 AS FLOAT), 2) 
UNION 
SELECT CONVERT(NVARCHAR(30), CAST(888901 AS FLOAT), 2) 
UNION 
SELECT CONVERT(NVARCHAR(30), CAST(888903 AS FLOAT), 2) 
UNION 
SELECT CONVERT(NVARCHAR(30), CAST(888909 AS FLOAT), 2) 
UNION 
SELECT CONVERT(NVARCHAR(30), CAST(888889 AS FLOAT), 2) 

給出了這些結果

8.888890000000000e + 005

8.889000000000000e + 005

8.889010000000000e + 005

8.889030000000000e + 005

8.889090000000000e + 005

所以,你要麼需要轉換爲int第一

results.Where(x => ((int)x.mySerial).ToString().Contains(TextBox_mySerial.Text)) ; 

或者輸入類似 「8.8890」 來代替。真的沒有一個是非常好的選擇,所以你可能想考慮將值存儲爲NVarChar,而不是數字的字符串操作。

+0

這個問題很好的闡述 –

0

,如果您有要轉換爲字符串雙,那麼你必須選擇一些字符串表示,按這樣的: https://msdn.microsoft.com/en-GB/library/ms187928.aspx你會得到

總是16位。始終以科學記數法使用。


的解決方案是提供首選格式。 好像是你的字段實際上是一個int嗎? (即你給出的所有例子都是整數),所以x.mySerial.ToString(「0」)應該提供你想要的。