I have a simple web application, using MVC and EF4.0. I use VS 2010 and SQL Server 2008 Express installed locally on my workstation.
I have this slow function, I have tried some tricks to speed it up, but with no success. I have had a glance to this links:
Performance Considerations for EF5
but the amount of information is a little bit overwhelming, for me. That at least, so I need some directions.
public List<VRapportiCT> ViewRapportiToList(string codArticolo, DateTime startDate, DateTime endDate)
{
// RapportiEntities : ObjectContext
RapportiEntities context = new RapportiEntities();
//context.VRapportiCT.MergeOption = MergeOption.NoTracking; // No improvement
// startDate = 01/01/2013
// endDate = 31/12/2013
List<VRapportiCT> myList = context.VRapportiCT
.Where(r => r.DCodArt == codArticolo && r.DStorico >= startDate && r.DStorico <= endDate)
.OrderBy(r => r.DStorico).ToList();
// 1° query Elapsed time: 8 sec.
myList = context.VRapportiCT
.Where(r => r.DCodArt == codArticolo && r.DStorico >= startDate && r.DStorico <= endDate)
.OrderBy(r => r.DStorico).ToList();
// 2° query Elapsed time: 8 sec.
return myList;
}
The SQL query, executed directly on the DB is very fast, actually less than 0,5 second (I have measured it with SQL Server Profiler).
I use VS 2010 in debug mode to "visually check" the performance (but also compiling the app in Release mode and testing directly the call in the browsers doesn't bring any improvements).
All the time is spent on that .ToList()
call, but where exactly?
PS. The query returns only a very small number of records, say 10 records, from a view that (unfiltered) contains of course a lot more records ;-)
So the sloppy performance doesn't seem, to me, related to some "EF magic object's trees materialization and connections behind the scenes"
EDIT The DB View T-SQL code:
SELECT TOP (100) PERCENT L.KLinea, LTRIM(RTRIM(L.DLinea)) AS DLinea, LTRIM(RTRIM(R.DCodArt)) AS DCodArt, LTRIM(RTRIM(R.DDescArt)) AS DDescArt, N.KNota, N.DNota,
T.DStorico, CAST(DATEPART(day, T.DStorico) AS varchar) + '/' + CAST(DATEPART(month, T.DStorico) AS varchar) + '/' + CAST(DATEPART(year, T.DStorico) AS varchar)
AS Data, REPLACE(LTRIM(RTRIM(U.DTurno)), 'Turno', 'Lettera') AS Lettera, U.KTurno,
FROM dbo.TRapportiCT AS T INNER JOIN
dbo.TPersonale AS P ON T.KPersona = P.KPersona INNER JOIN
dbo.TTurni AS U ON T.KTurno = U.KTurno INNER JOIN
dbo.RRapNotCod AS R ON T.KRapporto = R.KRapporto INNER JOIN
dbo.TLinea AS L ON R.KLinea = L.KLinea INNER JOIN
dbo.TNoteCT AS N ON R.KNota = N.KNota
WHERE (P.KRuolo = 2)
ORDER BY T.DStorico, N.KOrdine
The unfiltered View returns 54.000 records.