排查 LINQ to Entities 中的“ToString() 方法无法识别”错误
使用 LINQ to Entities 时,您可能会遇到错误“LINQ to Entities 无法识别方法‘System.String ToString()’方法。”发生这种情况是因为 LINQ to Entities 很难将 ToString()
方法转换为与数据库兼容的查询。 解决方案包括避免在 LINQ 查询中直接使用 ToString()
。
这是解决此问题的修改后的代码示例:
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { string strItem = item.Key.ToString(); // Assign ToString() result to a variable IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
通过将 item.Key.ToString()
的结果预先分配给 strItem
变量,我们绕过了翻译问题。 where
子句现在使用字符串文字,LINQ to Entities 提供程序可以有效地处理该字符串。
替代方法:利用 SqlFunctions
实体框架提供SqlFunctions
帮助器类,提供特定于数据库的功能。 这为此类情况提供了更优雅的解决方案。 SqlFunctions.StringConvert
方法允许在数据库查询本身内进行转换。
以下是实施此解决方案的方法:
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((double?)p.Serial) == item.Key.ToString() //Note the cast to (double?) if needed select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
这种方法将字符串转换保留在数据库查询中,提高了效率并避免了翻译错误。请注意,SqlFunctions.StringConvert
通常需要将数据库字段转换为合适的类型(例如,如果 (double?)p.Serial
是数字类型,则为 p.Serial
)。 根据需要调整转换以匹配您的数据库架构。 通常首选此方法,以获得更好的性能和更清晰的代码。
以上是如何解决'LINQ to Entities 无法识别方法'System.String ToString()'方法”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!