对 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中文网其他相关文章!