Ich habe die folgende kompilierte Abfrage.
%Vor%Dies wird sofort in der Datenbank ausgeführt, wenn ich
mache %Vor%Wie in vor tun
%Vor%Aber wenn diese Abfrage nicht wie in
kompiliert wurde %Vor%dann wird es in der Datenbank nach ausgeführt
ausgeführt %Vor%Ist das das erwartete Verhalten?
Hinweis: Dies ist ein Duplikat von Wann wird eine kompilierte Abfrage, die ein IQueryable zurückgibt, ausgeführt? , aber alle Antworten scheinen meinen Ergebnissen nicht zu entsprechen. Ich habe meine Antwort dort gepostet, aber ich weiß nicht, wie ich die Leute darauf aufmerksam machen soll, da es über 2 Jahre alt ist.
Interessante Frage. Wenn Sie eine kompilierte Abfrage in kompilierte Quellen übersetzen, geschieht Folgendes:
%Vor%Die UseExpressionCompile-Methode ist wie folgt definiert:
%Vor%Dies ergibt für den von Ihnen definierten Ausdruck den Wert false, sodass der Fall else verwendet wird.
Der Aufruf ist wie folgt:
%Vor%Die ExecuteQuery ist wie folgt:
%Vor%In diesem Fall ist unser Provider die SqlProvider-Klasse, der SqlProvider.CompiledQuery ist die Klasse, die ICompiledQuery implementiert. Execute für diese Klasse ist implementiert:
%Vor%SqlProvider.ExecuteAll ruft SqlProvider.Execute auf, was eine ziemlich große Methode ist, also poste ich die Highlights:
%Vor%Zwischen dem Akquirieren und dem Freigeben der Verbindung werden die SQL-Befehle ausgeführt. Ich würde sagen, du hast Recht. Entgegen der landläufigen Meinung verhalten sich kompilierte Abfragen bei der verzögerten Ausführung nicht wie unkompilierte Abfragen.
Ich bin mir ziemlich sicher, dass Sie den eigentlichen Quellcode von MS herunterladen können, aber ich habe ihn nicht griffbereit und Resharper 6 hat eine geniale Dekompilierung, also habe ich das einfach benutzt.
Ich habe zu Andrew Barretts Antwort nichts hinzuzufügen außer:
Ja, das stimmt. Es wird nichts gehen und nichts bekommen, bis du es fragst.
Überprüfen Sie MSDN auf Deferred versus Immediate Loading . Insbesondere können Sie das faule Laden aktivieren / deaktivieren .
Sehen Sie sich die meistbeantwortete Antwort zu dieser Frage an, wo die endgültige Liste & lt; T & gt; geschaffen. Es gibt eine Select-Anweisung, die sie abschickt und nach einem Ergebnis fragt. LINQ wartet so lange wie möglich auf das Senden einer Anfrage an die Datenbank.
Übrigens können Sie dies leicht untersuchen, wenn Sie die Eigenschaft DataContext.Log
:
Dann können Sie die SQL-Anweisungen auf der Konsole ansehen. Indem Sie durch Ihr Programm gehen, können Sie genau sehen, wann die SQL-Anweisung die Datenbank trifft.
Tags und Links c# linq linq-to-sql