查询在SQL中运行不到一毫秒,但在实体框架中超时

Mic*_*lle 13 sql-server entity-framework

抛出以下linq-to-entities查询

实体框架超时已过期.操作完成之前经过的超时时间或服务器没有响应.

在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();
Run Code Online (Sandbox Code Playgroud)

((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]
Run Code Online (Sandbox Code Playgroud)

来自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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 8

我用EF6观察了这个问题.

await _context.Database.SqlQuery<MyType>(sql)即使我的超时值达到60秒,我也会超时.但是,在SSMS中执行完全相同的SQL(使用的探查器来确认我传入的sql是未修改的)在一秒内产生了预期的结果.

exec sp_updatestats

解决了我的问题.