LINQ to Entities:解决“方法无法识别”异常
数据库迁移常常会导致方法识别问题。一个常见的错误是:
“LINQ to Entities 无法识别‘System.String ToString()’方法,并且此方法无法转换为存储表达式。”
这通常发生在将字符串属性与字符串表达式进行比较时,如下所示:
<code>IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p;</code>
了解根本原因:
ToString()
方法不会直接执行,而是被视为 MethodGroup。 LINQ 尝试将此组转换为等效的 SQL 表达式。 如果目标数据库缺少直接的 ToString()
等效项,则翻译失败。
解决方案:预存储字符串值:
最简单的修复方法是在比较之前将字符串结果存储在变量中:
<code>string strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
这会从查询中删除 ToString()
调用,从而防止翻译错误。
替代方案:利用 SqlFunctions:
SqlFunctions
帮助程序类为 LINQ to Entities 查询提供特定于数据库的函数。对于ToString()
,您可以尝试:
<code>IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((decimal?)p.Serial) == item.Key select p;</code>
请注意对 (decimal?)
的转换,这通常是必要的,具体取决于 p.Serial
的基础数据库类型。 SqlFunctions
可以简化代码并避免临时变量,但需要仔细考虑数据类型。
以上是为什么在使用 ToString() 时 LINQ to Entities 会引发'方法无法识别”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!