LINQ to Entities:排除“System.String ToString()”错误
使用 LINQ to Entities (LINQ2E) 查询和操作关系数据库中的数据时,您可能会遇到错误:“LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且此方法无法翻译成商店表达式。” 当 LINQ 表达式以无法直接转换为 SQL 等效项的方式对字符串使用 ToString()
方法时,就会发生这种情况。
让我们来看看这个场景:
<code class="language-C#">using (var context = new Context()) { // ... foreach (var item in collection) { IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
这里,ToString()
是在 item.Key
子句中的 where
(字符串)上调用的。 LINQ2E 很难将其转换为 SQL,因为 ToString()
缺乏直接的 SQL 对应项。
问题的解决方案
最直接的解决方案是将字符串值预先分配给变量:
<code class="language-C#">var strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
这是有效的,因为 LINQ2E 现在将 strItem
视为常量,从而消除了翻译的需要。
替代解决方案(EF Core 2.1 及更高版本):
EF Core 2.1 及更高版本提供了 SqlFunctions
辅助类,专门为 LINQ2E 表达式提供了 StringConvert
方法:
<code class="language-C#">IQueryable<entity> pages = from p in context.pages where p.Serial == SqlFunctions.StringConvert((double?)item.Key) // Note the cast to (double?) select p;</code>
使用任一方法都可以解决“System.String ToString()”异常并确保您的 LINQ2E 查询正确执行。 请记住适当处理潜在的空值,如 (double?)
示例中的 SqlFunctions
转换所示。 这对于数据库兼容性通常是必需的。
以上是为什么 LINQ to Entities 会引发'System.String ToString()”异常,以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!