LINQ to SQL * kompilierte * Abfragen und wenn sie ausgeführt werden

9

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.

    
lahsrah 06.07.2011, 06:30
quelle

3 Antworten

8

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.

    
Andrew Barrett 06.07.2011, 13:26
quelle
1

Ich habe zu Andrew Barretts Antwort nichts hinzuzufügen außer:

  • Dies ist wahr (d. h. Abfrage trifft Datenbank), wenn Sie einen Delegaten aufrufen, der von CompiledQuery.Compile () nur für LINQ to SQL zurückgegeben wird.
  • Wenn Sie LINQ zu Entitäten verwenden, ist dies NICHT wahr. Die Abfrage trifft nicht auf die Datenbank, wenn Sie den Delegaten aufrufen. Dies geschieht nur, wenn Sie mit dem Abrufen von Daten beginnen. Verhalten im Einklang mit nicht kompilierten Abfragen.
alex 12.07.2011 17:46
quelle
-1

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 :

setzen %Vor%

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.

    
Kieran 06.07.2011 06:59
quelle

Tags und Links