2016-07-13 4 views
2

Ich habe eine einfache Web MVC App mit Datenbank ersten Entity Framework. Ich erhalte Informationen aus einer Tabelle. Es ist sehr langsam.Entity Framework ruft SQL Server oft

Ich habe zwei Probleme:

  1. Wenn ich die Abfrage mit SQL Server Profiler überprüfen, es zeigt die Abfrage als Select Abfrage mit einer von-Klausel, die eine andere Auswahlabfrage ist. Ich bin mir nicht sicher, warum es eine andere Auswahl anstelle des Tabellennamens verwendet. Könnte dies die Abfrage verlangsamen?

  2. Wenn ich die Zeilen abrufe, wird die Datenbank für jede Zeile aufgerufen, um den Prozess zu verlangsamen. Es verwendet den Schlüssel aus der Tabelle und fragt die Datenbank für jede Zeile erneut ab. Warum ruft es die Datenbank für jede Zeile ab? Hat die erste Abfrage nicht alle Zeilen zurückgegeben?

Unten ist mein Code und SQL Server Profiler Ergebnisse.

Code:

List<FanDetail> fans = db.FanDetails.ToList(); 

foreach (var item in fans) 
{ 
    FanSummaryViewModel add = new FanSummaryViewModel() 
    { 
    Part_No = item.Part_No, 
    } 
} 

SQL Server Profiler Ergebnisse für die Abfrage:

SELECT 
    [Extent1].[Part_No] AS [Part_No] 
FROM 
    (SELECT 
     [FanDetails].[Part_No] AS [Part_No] 
    FROM 
     [dbo].[FanDetails] AS [FanDetails]) AS [Extent1] 

SQL Profiler For Each auf die Ergebnisse:

exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Part_No] AS [Part_No] 
    FROM (SELECT 
    [FanDetails].[Part_No] AS [Part_No] 
    FROM [dbo].[FanDetails] AS [FanDetails]) AS [Extent1] 
    WHERE [Extent1].[Part_No] = = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0='00405635' 

mich, ob ich wissen lassen müssen mehr Details zur Verfügung stellen.

Ich bin neu bei EF und habe seit einiger Zeit an diesem Leistungsproblem gearbeitet.

Antwort

3

Sie sollten in der Lage sein, alle die Abfrage und Projektion in einer einzigen Abfrage zu erreichen:

List<FanSummaryViewModel> fans = db.FanDetails 
            .Select(item => new FanSummaryViewModel 
               { 
                Part_No = item.Part_No 
               }) 
            .ToList(); 

Die Select-Anweisung vor dem ToList der Parser erstellen richtig scoped Abfrage helfen und wird nur kehren die Felder bezeichnet und erstellen Sie ein neues Objekt für jede Zeile, wenn die Liste aufgelistet wird, was die ToList-Anweisung erreicht.

Sie sollten auch die Abfrageleistung der generierten Sql für die Datenbank direkt überprüfen, um festzustellen, ob das Problem nur bei der Datenbank auftritt, die Sie möglicherweise mit einem Index beheben können.

+0

Das war genau das, was ich brauchte. Danke für die Rückmeldung und Hilfe. Es hat meine Seitenladezeit von 15-20 Sekunden auf unter 3 Sekunden reduziert. Mit Ihrer Anweisung war es sehr einfach zu implementieren. – user2011126

Verwandte Themen