Sql server LINQ to实体中的string.contains会导致执行非常缓慢

Sql server LINQ to实体中的string.contains会导致执行非常缓慢,sql-server,entity-framework-4,Sql Server,Entity Framework 4,此LINQ表达式: var result = entities.Cases .Where(c => c.House.Address.Contains("otte")) .ToList(); var value = "otte"; var result = entities.Cases .Where(c => c.House.Address.Contains(value)) .ToList

此LINQ表达式:

var result = entities.Cases
            .Where(c => c.House.Address.Contains("otte"))
            .ToList();
var value = "otte";
var result = entities.Cases
            .Where(c => c.House.Address.Contains(value))
            .ToList();
在服务器上执行此sql:

SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE '%otte%'
exec sp_executesql N'SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE @p__linq__0 ESCAPE N''~''',N'@p__linq__0     nvarchar(4000)',@p__linq__0=N'%otte%'
这需要大约100毫秒才能完成

此LINQ表达式:

var result = entities.Cases
            .Where(c => c.House.Address.Contains("otte"))
            .ToList();
var value = "otte";
var result = entities.Cases
            .Where(c => c.House.Address.Contains(value))
            .ToList();
在服务器上执行此sql:

SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE '%otte%'
exec sp_executesql N'SELECT 
...
--rows
...
FROM  [dbo].[Case] AS [Extent1]
INNER JOIN [dbo].[House] AS [Extent2] ON [Extent1].[HouseID_FK] = [Extent2].[HouseID]
WHERE [Extent2].[Address] LIKE @p__linq__0 ESCAPE N''~''',N'@p__linq__0     nvarchar(4000)',@p__linq__0=N'%otte%'
这大约需要1400毫秒才能完成

如果我将“value”声明为常量,我也可以让它生成“fast”sql,但我希望能够在运行时更改“value”的值。有没有办法强迫实体框架不生成“exec sp_executesql”样式的sql,因为这显然要慢得多?

接下来,我建议sql Server(LINQ/EF)试图比您更聪明,并且可以告诉您,您将使用一个不同参数的查询,使用sp_executesql是当前推荐的一致运行该查询的方法(非常确定这是为了让SQL Server能够高效缓存该查询)。您可能会在这一个查询中失败,但通过重复使用来弥补损失

您可以考虑修改数据库以要求或参数化(您希望“强制”),但这可能会导致任何其他查询的性能显著降低,但YMMV除外

我建议避免在SQL Server本身中进行任何字符串比较。。。现在RAM非常丰富,我发现偶尔只需提升两个对应的数据集并比较C#中的字符串值(同样,YMMV)会更快

如果做不到这一点,根据您的要求,尝试使用或vs或查看在性能方面是否有任何改进


祝你好运。

这可能会有所帮助,因为它是相关的:可能是的问题。我尝试了选项(重新编译),它使查询执行速度提高了一倍左右。这仍然太慢,无法接受,因为我实际上在查询中包含了许多其他表,这加剧了问题。目前,我们已经找到了问题的另一个解决方案,它不涉及“包含”查询。