在 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。
我正在尝试将 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。