我正在尝试将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分钟。
答案 0 :(得分:1)
问题是Entity Framework无法将SubString()
方法转换为sql,因此它必须获取所有过滤到该行的记录并在内存中进行过滤。你能做的最好的事情就是通过EF执行你的sql查询,如下所示:
using(var context = new MyContext)
{
var result = context.MyEntity.SqlQuery("SQL string here").ToList();
}
更多信息here。