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 提供 length 和 decimal 引數值,則這些值應該是正數。在預設情況下或小數引數為 0 時,數字舍入為整數。指定的長度應大於或等於小數點前面的部分加上數字符號(如果有)的長度。短的 float_expression
注意: |
---|
若要轉換為 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的處理方式
也需要測試。