以下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();
((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
答案 0 :(得分:5)
我在EF6中观察到了这个问题。
即使我的超时值达到60秒, await _context.Database.SqlQuery<MyType>(sql)
也会超时。但是,在SSMS中执行完全相同的SQL(使用的探查器来确认我传入的sql是未修改的)会在一秒内产生预期的结果。
exec sp_updatestats
为我解决了这个问题。
答案 1 :(得分:3)
我知道这有点晚了,但我找到了答案here。
基本上,实体框架喜欢默认跟踪所有内容。如果您不需要它(即不插入或更新或删除实体),请将其关闭以加快查询速度。
如果你正在使用Entity Framework Code First,你可以这样做:
var q = (from contact
in cDB.Contacts.AsNoTracking()
.Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer)
&& !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer))
select contact.Taal).Distinct();
答案 2 :(得分:2)
我和EF6有类似的问题。在EF中使用SqlQuery函数时,虽然在Management Studio中以毫秒为单位执行查询,但我得到了超时。我发现它是由于我在EF查询中使用的一个sql参数的值而发生的。为清楚起见,下面是我遇到的类似SQL查询。
SELECT * FROM TBL WHERE field1 > @p1 AND field2>@p2 AND field3<@p3
当@ p1为零时,我收到超时异常。当我把它变成1或者不同的东西时,它是以毫秒为单位执行的。顺便说一句,我查询的表有超过20M的行。
我希望它有所帮助, 最好
答案 3 :(得分:1)
(DBCC FREEPROCCACHE)
DBCC DROPCLEANBUFFERS
现在让问题消失了,但我认为这可能只是一个临时性问题。溶液
答案 4 :(得分:-1)
您需要添加一列作为uniqueId或键才能在EF
中工作