1. 程式人生 > >System.Data.Objects.SqlClient.SqlFunctions.StringConvert()注意事項

System.Data.Objects.SqlClient.SqlFunctions.StringConvert()注意事項

當出現

LINQ to Entities 不識別方法"System.String ToString()",因此該方法無法轉換為儲存表示式.

錯誤時,我們會想到用System.Data.Objects.SqlClient.SqlFunctions.StringConvert()這個類對相關欄位進行轉換。

但是,轉換完成後,得到的查詢結果可能會沒有資料。

導致這個問題的原因是由於上面的StringConvert()函式在轉換為SQL時,是轉換為 STR函式的,這一點我們可以通過LINQ中的ToTraceString()方法,

對生成的SQL語句進行檢視。

因為STR方法在生成字串的時候,它是有可能會補空格的,也有可能會得到**的結果,具體如下參考:

語法

STR ( float_expression [ , length [ , decimal ] ] )

引數

float_expression

帶小數點的近似數字 (float) 資料型別的表示式。

length

總長度。它包括小數點、符號、數字以及空格。預設值為 10。

decimal

小數點後的位數。decimal 必須小於或等於 16。如果 decimal 大於 16,則會截斷結果,使其保持為小數點後具有十六位。

返回型別

char

備註

如果為 STR 提供 lengthdecimal 引數值,則這些值應該是正數。在預設情況下或小數引數為 0 時,數字舍入為整數。指定的長度應大於或等於小數點前面的部分加上數字符號(如果有)的長度。短的 float_expression

在指定長度內右對齊,長的 float_expression 則截斷為指定的小數位數。例如,STR(12,10) 輸出的結果是 12。它在結果集內右對齊。而 STR(1223,2) 則將結果集截斷為 **。可以巢狀字串函式。

注意:
若要轉換為 Unicode 資料,請在 CONVERT 或 CAST 轉換函式內使用 STR。

綜上所述:

如果我們有如下的LINQ 語句

a,b兩個表中的關鍵字ID的值有關聯,但是型別不同

var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID),r=>r.ID,....);

最好寫成如下方式:

var result=a.Join(b,l=>System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)l.ID).Trim(),r=>r.ID,....);

這樣可以避免因為引入空格,而導致連線失敗。

另外,需要注意的是STR預設的length是10,所以在要轉換的資料超過10的時System.Data.Objects.SqlClient.SqlFunctions.StringConvert的處理方式

也需要測試。