16

以下 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]

来自跟踪字符串的查询在 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
4

5 回答 5

12

我在 EF6 中观察到了这个问题。

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

执行 sp_updatestats

为我解决了这个问题。

于 2016-12-22T20:42:01.467 回答
2
(DBCC FREEPROCCACHE)
DBCC DROPCLEANBUFFERS

暂时解决了这个问题,但我认为这可能只是一个临时工。解决方案

于 2012-07-06T06:27:11.640 回答
2

我知道这有点晚了,但我在这里找到了答案。

基本上,Entity Framework 喜欢默认跟踪所有内容。如果您不需要它(即不插入、更新或删除实体),请将其关闭以加快查询速度。

如果您首先使用实体​​框架代码,则可以这样实现:

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();
于 2013-02-21T23:33:47.500 回答
2

我对 EF6 有类似的问题。在 EF 中使用 SqlQuery 函数时,尽管在 Management Studio 中以毫秒为单位执行了查询,但我得到了超时。我发现它是由于我在 EF 查询中使用的一个 sql 参数的值而发生的。为了清楚起见,下面是我遇到的类似 SQL 查询。

SELECT * FROM TBL WHERE field1 > @p1 AND field2>@p2 AND field3<@p3

当@p1 为零时,我收到超时异常。当我将其设为 1 或其他内容时,它会在几毫秒内执行。顺便说一句,我查询的表有超过 20M 行。

我希望它有帮助,最好的

于 2014-11-21T11:48:10.397 回答
-2

您需要添加一列作为唯一 ID 或键才能在 EF 中工作

于 2017-06-07T02:52:28.550 回答