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)
我用EF6观察了这个问题.
await _context.Database.SqlQuery<MyType>(sql)即使我的超时值达到60秒,我也会超时.但是,在SSMS中执行完全相同的SQL(使用的探查器来确认我传入的sql是未修改的)在一秒内产生了预期的结果.
exec sp_updatestats
解决了我的问题.
| 归档时间: |
|
| 查看次数: |
6751 次 |
| 最近记录: |