.Skip (). Take () in Entity Framework Navigation Properties führt SELECT * auf meinem SQL Server aus

8

Ich habe eine Methode für meine generierte partielle Klasse wie folgt:

%Vor%

Wenn ich mir meinen SQL Server anschaue, kann ich sehen, dass der generierte Code eine SELECT *.* FROM Children macht. Dieser Code stammt direkt von meiner Klasse. Ich habe überprüft, dass die Reihenfolge meiner Skip / Take VOR meiner .ToList ist.

Wenn ich die .ToList entferne, ist diese Zeile schnell (und es wird keine SQL an meine Datenbank gesendet), aber in dem Moment, in dem ich foreach über die Ergebnisse versuche, bekomme ich dieselbe SQL an meine DB: SELECT *.* FROM Children .

Gibt es etwas Besonderes, wenn ich .Skip und .Take in den Navigationseigenschaften meiner Entitäten verwende?

update

Ich werde versuchen, das eigentliche SQL zu generieren, ich bin momentan nicht dafür eingerichtet. Ich habe das erste gefunden, weil es in der SSMS-Liste "Kürzlich teuerste Anfragen" auftaucht.

Ausführen:

%Vor%

gibt ~ 4.000.000 Zeilen zurück und dauert ~ 25 Sekunden.

Ausführen:

%Vor%

gibt ~ 4.000.000 Zeilen zurück und dauert ~ 25 Sekunden.

Wie ich schon sagte, werde ich das SQL, das für diese generiert wurde, packen und sie ebenfalls darstellen.

    
Nate 28.12.2011, 23:17
quelle

2 Antworten

7

Das Problem besteht darin, dass Sie eine LINQ-zu-Objekt-Abfrage ausführen, wenn Sie eine untergeordnete Sammlung wie diese abfragen. EF lädt die gesamte Sammlung und führt die Abfrage im Speicher aus.

Wenn Sie EF 4 verwenden, können Sie wie folgt

abfragen %Vor%

In EF 4.1

%Vor%     
Eranga 29.12.2011, 00:04
quelle
1

Hilft es, wenn Sie Skip für das Ergebnis von Take aufrufen? d. h.

%Vor%

Siehe auch

Ben Voigt 28.12.2011 23:36
quelle