Führt AsQueryable () in ICollection wirklich eine verzögerte Ausführung durch?

8

Ich verwende Entity Framework CodeFirst, wo ich Eltern-Kind-Beziehungen mit ICollection als

verwendet habe %Vor%

Ok, soweit funktioniert alles ok, aber meine Sorge ist, wann immer ich die Blogs einer Person bekommen will, bekomme ich es als

%Vor%

Nun verstehe ich, dass wenn die Zeile ausgeführt wird, alle Blogs für diese Person in den Speicher geladen werden und das Sortieren und Auswählen aus dem Speicher erfolgt. Das ist nicht ideal für eine Aufzeichnung von Person, die eine große Anzahl von Blogs hat. Ich möchte den Blog Child als IQueryable machen, so dass das Sortieren und Auswählen in der SQL-Datenbank erfolgt, bevor Sie in den Speicher ziehen.

Ich weiß, dass ich die Blogs in meinem Kontext als IQueryable deklarieren könnte, so dass ich direkt als

abfragen könnte %Vor%

Aber das ist für mich aufgrund der Designauswahl nicht machbar, ich möchte aufgrund des Serialisierungsproblems so gut wie möglich einen Zirkelbezug vermeiden. Also habe ich keinen Bezug auf die Eltern-Entität in meinem Kind gemacht.

Ich habe festgestellt, dass ich die Methode AsQueryable () in den Blogs als

aufrufen kann %Vor%

Das sieht für mich wie eine Magie aus und scheint zu gut um wahr zu sein. Also meine Frage. Ist AsQueryable tatsächlich die ICollection als IQueryable in der Realität und macht alle Abfragen Prozess in SQL Server (Lazy Loading) ODER es ist nur ein Casting, bei dem Blogs in Speicher wie zuvor geladen werden, aber ändern Sie die Schnittstelle von ICollection zu IQueryable?

    
Emran Hussain 08.02.2012, 10:01
quelle

2 Antworten

6

Es scheint also so zu sein, dass Sie Ihre Navigationseigenschaft als IQueryable<T> ist nicht möglich .

Sie können eine Navigationseigenschaft zu Blog hinzufügen:

%Vor%

Daraus können Sie wie folgt abfragen, damit nicht alles in den Speicher geladen wird:

%Vor%

Ich empfehle Ihnen, LINQPad zu versuchen, um zu sehen, wie LINQ in SQL übersetzt wird und was tatsächlich von der DB angefordert wird.

    
ken2k 08.02.2012, 10:15
quelle
2

Ein besserer Ansatz wird in Ladislavs Antwort beschrieben. In Ihrem Fall:

%Vor%     
Diego Mijelshon 09.02.2012 03:11
quelle