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

时间:2016-01-05 19:07:05

标签: entity-framework linq entity-framework-4 linq-to-entities

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

1 个答案:

答案 0 :(得分:1)

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

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

更多信息here