2013-10-09 54 views
1

我正在嘗試將SQLClient用於實體框架功能,但我遇到了一些問題。我需要將ID(其在數據庫中爲int)轉換爲nvarchar,以便我可以使用通配符進行比較。SQLClient字符串函數NVARCHAR而不是STR

這在一定程度上有效(即它的構建和執行沒有錯誤),然而這不是我需要做的數據庫方面,它返回錯誤的結果。事實上,它返回0行,當它應該返回一個數字。

return "SqlServer.STR(ID) LIKE '824%'"; 

上面一行基本上轉化爲下面的線在SQL

SELECT COUNT(*) FROM Table1 WHERE STR(ID) LIKE '824%' 

我需要在SQL是以下行(或類似的東西),因爲這將返回正確的行數。

SELECT COUNT(*) FROM Table1 WHERE CONVERT(NVARCHAR(50), ID) LIKE '824%' 

我已經嘗試使用:

return "CAST(ID AS NVARCHAR(50)) LIKE '824%'"; 

但是這給在運行時出現以下錯誤:

類型 'NVARCHAR' 無法被發現。確保所需的 架構已加載,並且名稱空間已正確導入。

誰能告訴我如何使用SqlClient字符串函數或其他一些變體來做到這一點?

謝謝大家。

+1

你可以改變你喜歡「%824%」? –

+0

是的,這似乎工作,非常感謝。我可以問爲什麼它的工作原理是這樣嗎?再次感謝。如果你將這個添加到答案中,我會將其標記爲已回答。 – Mattplus

+0

也許你應該以一種不需要複雜計算的方式存儲數據。如果你堅持,我已經提供了一個答案。 – usr

回答

2

您可以使用SqlFunction.StringConvert()函數。有沒有過載對於int,所以你必須強制類型轉換

var test = dataContext.Table1 
         .Where(f => SqlFunctions.StringConvert((double) f.Id) 
               .Trim() 
               .StartsWith("824")) 
         .Select(f => SqlFunctions.StringConvert((double) f.Id) 
               .Trim()) 
         .ToList(); 

這將轉化爲

SELECT 
LTRIM(RTRIM(STR(CAST([Extent1].[Id] AS float)))) AS [C1] 
FROM [dbo].[Table1] AS [Extent1] 
WHERE (LTRIM(RTRIM(STR(CAST([Extent1].[Id] AS float)))) LIKE N'4%') 
+0

我認爲這是一個破解。問題是右對齊,而不是搜索條件錯誤。我不喜歡修復錯誤,我解決根本原因。擺脫右對齊(這是瘋狂的行爲)。 – usr

+0

你是對的。這是一個破解 –

+0

但使用'SqlFunctions.StringConvert((double)x.Id))'不會解決它,因爲EntityFramwork正在使用STR來轉換它。 –

相關問題