sql-server - 查询在 SQL 中运行时间不到一毫秒,但在 Entity Framework 中超时

标签 sql-server entity-framework

以下 linq-to-entities 查询抛出

Entity Framework Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

在 ToList() 之后。

 var q = (from contact 
          in cDB.Contacts.Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer) 
                                && !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer)) 
          select contact.Taal).Distinct();

((System.Data.Objects.ObjectQuery)q).ToTraceString() 给我:

SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
[Extent1].[Taal] AS [Taal]
FROM [dbo].[ContactSet] AS [Extent1]
WHERE ( EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[TemplategroepContact] AS [Extent2]
WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
)) AND ( NOT EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[UitschrijvingenSet] AS [Extent3]
WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
))
)  AS [Distinct1]

tracestring 的查询在 sql Management Studio 中运行时间不到 1 秒,但在实际列出它时超时?这怎么可能呢?

*更新:为查询添加了 SQL PROFILER 输出*其运行速度与 EF ToList() 一样慢(>30 秒)

exec sp_executesql N'SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
    [Extent1].[Taal] AS [Taal]
    FROM [dbo].[ContactSet] AS [Extent1]
    WHERE ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[TemplategroepContact] AS [Extent2]
        WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
    )) AND ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[UitschrijvingenSet] AS [Extent3]
        WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
    ))
)  AS [Distinct1]',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=1,@p__linq__1=1

最佳答案

我在 EF6 中发现了这个问题。

await _context.Database.SqlQuery<MyType>(sql)即使我的超时值调至 60 秒,仍然超时。然而,在 SSMS 中执行完全相同的 SQL(使用探查器确认我传入的 SQL 未被修改)在一秒钟内产生了预期的结果。

执行sp_updatestats

为我解决了这个问题。

关于sql-server - 查询在 SQL 中运行时间不到一毫秒,但在 Entity Framework 中超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11344499/

相关文章:

sql-server - SQL Server Express 的 SQL 代理/别名

sql-server - 带有 PowerShell 脚本的 SSIS 刷新 Excel 连接?

sql-server - 如果 SQL Server 2008 r2 中存在,则删除列

SQL Server 2008 是否有更有效的方法来执行此更新循环?

asp.net-mvc - 在MVC中,我如何返回IQueryable结果并使用操作在 View 中显示它

c# - System.Threading.TimerCallback 仅在使用 Entity Framework 时触发一次

sql-server - 如何为 SQL Server 的 Ruby ODBC 驱动程序设置超时?

c# - ASP.NET 5 Web API 项目模板不允许使用 Entity Framework

wpf - 为什么在我的WPF应用程序中有时会发生此 Entity Framework 崩溃?

database - 默认 ASP.NET MVC 3 项目帐户 Controller 如何工作