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
Likely you need to update your statistics and flush your query caches.
DBCC FLUSHPROCINDB
and
UPDATE STATISTICS
may help.