對 LINQ to Entities 和 ToString()
方法進行故障排除
本文解決了在實體框架中使用LINQ to Entities 時遇到的常見錯誤:“LINQ to Entities 無法識別'System.String ToString()'方法,並且此方法無法轉換為存儲表達式。”
問題:
核心問題在於ToString()
方法與LINQ to Entities的翻譯過程不相容。 當包含 ToString()
的 LINQ 查詢轉換為 SQL 以便資料庫執行時,實體框架無法找到對應的 SQL 等效項。 這通常出現在 where
子句中,例如 p.Serial == item.Key.ToString()
.
解1:預先轉換為字串
一個有效的方法是在ToString()
執行 LINQ 查詢之前執行轉換。 這可確保轉換發生在記憶體 (C#) 中,而不是在資料庫 (SQL) 中。
<code class="language-csharp">string strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
這個方法清楚地將資料轉換和資料庫查詢分開。
解 2:利用 SqlFunctions
(實體框架的輔助類)
一個更優雅的解決方案,在更高的實體框架版本中特別有用,它利用 SqlFunctions
類別。 此類別提供映射到 SQL 對應項的函數,為否則會失敗的表達式提供直接轉換。 對於字串轉換,請使用 SqlFunctions.StringConvert
:
<code class="language-csharp">IQueryable<entity> pages = from p in context.pages where p.Serial == SqlFunctions.StringConvert((double)item.Key) select p;</code>
請注意此範例中對 double
的明確轉換。所需的確切類型取決於 item.Key
的基礎資料類型。 您可能需要根據您的特定資料類型調整轉換。 該解決方案通常因其簡潔性以及與實體框架翻譯機制的直接整合而受到青睞。 它避免了對單獨變數的需要。
以上是為什麼 LINQ to Entities 不支援 ToString() 方法,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!