【发布时间】:2012-08-30 11:14:01
【问题描述】:
这个 LINQ 表达式:
var result = entities.Cases
.Where(c => c.House.Address.Contains("otte"))
.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%'
这需要大约 100 毫秒才能完成。
这个 LINQ 表达式:
var value = "otte";
var result = entities.Cases
.Where(c => c.House.Address.Contains(value))
.ToList();
在服务器上执行这条sql:
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,因为这显然要慢得多?
【问题讨论】:
-
也许这有帮助,因为它是相关的:stackoverflow.com/questions/9270490/…
-
可能是"parameter sniffing"的问题。
-
我尝试了 OPTION(RECOMPILE),它使查询的执行速度提高了两倍。它仍然太慢而无法接受,因为我实际上在查询中包含了许多其他表,这加剧了问题。目前我们已经找到了解决我们问题的另一种解决方案,它不涉及“包含” - 查询。
标签: sql-server entity-framework-4