在 LINQ 中使用子字符串会导致查询超时吗?

Using a Substring in LINQ causes query to time out?

我正在尝试将 Oracle SQL 语句转换为使用子字符串的 EF/LINQ。使用子字符串时,它会导致我的查询执行时间从 11 秒变为超时 运行 时间超过 5 分钟。

在我的情况下,我有一个 4 个字符的值,我只需要将第一个和第三个字符等于 "E" 的结果包含在结果中。我做错了吗?

这是我正在转换的 Oracle SQL。

and (substr(c.operates,1,1) = 'E' or substr(c.operates,3,1) = 'E') 

这是我的 Linq 语句。

&& (c.OPERATES.Substring(0, 1) == "E" || c.OPERATES.Substring(2,1) == "E")

即使只检查一个字符位置,这也会使查询时间从 11 秒缩短到 5 分钟以上。

问题是 Entity Framework 无法将 SubString() 方法转换为 sql,因此它必须获取过滤到该行的所有记录并在内存中过滤。您可以做的最好的事情就是通过 EF 执行 sql 查询,如下所示:

using(var context = new MyContext)
{
   var result = context.MyEntity.SqlQuery("SQL string here").ToList();
}

更多信息here