Search code examples
c#linq-to-entitiessql-server-2016

IQueryable timeout expired


I have a problem with the query to the database. When i try code below, it works 75ms and return empty List. Everything is ok.

var test1 = unit
    .PersonQualities.GetAll()
    .Where(qp => qp.QualityId == qualityId && qp.PersonId == targetPersonId)
    .ToList();

But when i use this, it works 30sec and return timeout expired exception:

var test2 = unit
    .PersonQualities.GetAll()
    .FirstOrDefault(qp => qp.QualityId == qualityId && qp.PersonId == targetPersonId);

My GetAll method:

public virtual IQueryable<T> GetAll()
{
    return Entities.AsQueryable();
}

Please explain why this happens. And what can i do for fix this issue. Thanks. P.S. I`m using SQL Server 2016 Developer. Both queries works in SSMS.

FirstOrDefault query in profiler:

exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[Percent] AS [Percent], 
    [Extent1].[IsLocked] AS [IsLocked], 
    [Extent1].[PersonId] AS [PersonId], 
    [Extent1].[QualityId] AS [QualityId]
    FROM [dbo].[PersonQuality] AS [Extent1]
    WHERE ([Extent1].[QualityId] = @p__linq__0) AND ([Extent1].[PersonId] = @p__linq__1)',N'@p__linq__0 bigint,@p__linq__1 bigint',@p__linq__0=110207,@p__linq__1=43257113

SingleOrDefault:

exec sp_executesql N'SELECT TOP (2) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[Percent] AS [Percent], 
    [Extent1].[IsLocked] AS [IsLocked], 
    [Extent1].[PersonId] AS [PersonId], 
    [Extent1].[QualityId] AS [QualityId]
    FROM [dbo].[PersonQuality] AS [Extent1]
    WHERE ([Extent1].[QualityId] = @p__linq__0) AND ([Extent1].[PersonId] = @p__linq__1)',N'@p__linq__0 bigint,@p__linq__1 bigint',@p__linq__0=110207,@p__linq__1=43257113

Solution

  • Likely you need to update your statistics and flush your query caches.

    DBCC FLUSHPROCINDB
    

    and

    UPDATE STATISTICS
    

    may help.