Wie kann ich das vom Entity Framework generierte SQL anzeigen?
(In meinem speziellen Fall verwende ich den MySQL-Anbieter - wenn es darauf ankommt)
Wie kann ich das vom Entity Framework generierte SQL anzeigen?
(In meinem speziellen Fall verwende ich den MySQL-Anbieter - wenn es darauf ankommt)
Antworten:
Sie können Folgendes tun:
oder in EF6:
Dadurch erhalten Sie die generierte SQL.
quelle
.Single()
Ihr Objekt nach dem Ausführen wohl nicht mehr vorhanden istIQueryable
.result
zuSystem.Data.Entity.Infrastructure.DbQuery<T>
, dann interne Eigenschaft zu erhalten ,InternalQuery
wie(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, und nur dann, EinsatzToTraceString()
result.ToString()
Wenn Sie Entity Framework 6 und höher verwenden und die Ausgabe-SQL in Visual Studio anzeigen möchten (wie ich), müssen Sie die neue Protokollierungs- / Abfangfunktion verwenden.
Durch Hinzufügen der folgenden Zeile wird das generierte SQL (zusammen mit zusätzlichen ausführungsbezogenen Details) im Visual Studio-Ausgabefenster ausgegeben:
Weitere Informationen zum Anmelden bei EF6 finden Sie in dieser raffinierten Blogserie: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Hinweis: Stellen Sie sicher, dass Sie Ihr Projekt im DEBUG-Modus ausführen.
quelle
Ab EF6.1 können Sie mit Interceptors einen Datenbanklogger registrieren. Siehe Kapitel "Interceptors" und "Protokollieren von Datenbankoperationen" in einer Datei hier
quelle
Wenn Sie einen DbContext verwenden, können Sie Folgendes tun, um SQL abzurufen:
quelle
ToString()
gibt Ihnen die Abfrage mit Variablen darin, wiep__linq__0
anstelle der Endwerte (zB: 34563 stattp__linq__0
)Anwendbar für EF 6.0 und höher: Für diejenigen unter Ihnen, die mehr über die Protokollierungsfunktionalität erfahren und einige der bereits gegebenen Antworten ergänzen möchten.
Jeder von der EF an die Datenbank gesendete Befehl kann jetzt protokolliert werden. Verwenden Sie die, um die von EF 6.x generierten Abfragen anzuzeigen
DBContext.Database.Log property
Was wird protokolliert?
Beispiel:
Ausgabe:
So melden Sie sich bei einer externen Datei an:
Weitere Informationen hier: Protokollieren und Abfangen von Datenbankoperationen
quelle
In EF 4.1 können Sie Folgendes tun:
Dadurch erhalten Sie die generierte SQL.
quelle
ToString()
Ausgabe der Namespace dieses benutzerdefinierten Typs. Wenn beispielsweise der obige Codeselect new CustomType { x = x.Name }
wäre, wäre der zurückgegebene Wert so etwas wieCompany.Models.CustomType
anstelle des generierten SQL.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
für mich.Meine Antwort richtet sich an EF Core . Ich verweise auf dieses Github-Problem und die Dokumente zur Konfiguration
DbContext
:Einfach
Überschreiben Sie die hier gezeigte
OnConfiguring
Methode IhrerDbContext
Klasse (YourCustomDbContext
) , um einen ConsoleLoggerProvider zu verwenden. Ihre Abfragen sollten an der Konsole protokolliert werden:Komplex
Dieser komplexe Fall vermeidet das Überschreiben der
DbContext
OnConfiguring
Methode. , von dem in den Dokumenten abgeraten wird: "Dieser Ansatz eignet sich nicht zum Testen, es sei denn, die Tests zielen auf die vollständige Datenbank ab."Dieser komplexe Fall verwendet:
IServiceCollection
In-Startup
Class-ConfigureServices
Methode (anstatt dieOnConfiguring
Methode zu überschreiben ; der Vorteil ist eine lockerere Kopplung zwischen derDbContext
und der, dieILoggerProvider
Sie verwenden möchten).ILoggerProvider
(anstelle derConsoleLoggerProvider
oben gezeigten Implementierung; der Vorteil ist, dass unsere Implementierung zeigt, wie wir uns bei File anmelden würden (ich sehe keinen mit EF Core gelieferten File Logging Provider ))So was:
Hier ist die Implementierung von a
MyLoggerProvider
(und dessenMyLogger
Protokolle an eine Datei angehängt werden, die Sie konfigurieren können; Ihre EF Core-Abfragen werden in der Datei angezeigt.)quelle
Es gibt zwei Möglichkeiten:
ToTraceString()
. Sie können es in Ihr Überwachungsfenster einfügen und einen Haltepunkt festlegen, um zu sehen, wie die Abfrage an einem bestimmten Punkt für eine LINQ-Abfrage aussehen würde.tail -f
. Weitere Informationen zu den Protokollierungsfunktionen von MySQL finden Sie in der offiziellen Dokumentation . Für SQL Server ist es am einfachsten, den enthaltenen SQL Server-Profiler zu verwenden.quelle
Damit die Abfrage immer griffbereit ist, ohne den Code zu ändern, fügen Sie dies Ihrem DbContext hinzu und überprüfen Sie es im Ausgabefenster in Visual Studio.
Ähnlich wie bei @Matt Nibecker, aber damit müssen Sie es nicht jedes Mal in Ihren aktuellen Code einfügen, wenn Sie die Abfrage benötigen.
quelle
SQL Management Studio => Tools => SQL Server-Profiler
Datei => Neue Spur ...
Verwenden Sie die Vorlage => Leer
Ereignisauswahl => T-SQL
Überprüfen Sie die linke Seite auf: SP.StmtComplete
Spaltenfilter können verwendet werden, um einen bestimmten Anwendungsnamen oder Datenbanknamen auszuwählen
Starten Sie die Ausführung dieses Profils und lösen Sie die Abfrage aus.
Klicken Sie hier für Quellinformationen
quelle
Nun, ich verwende derzeit Express Profiler für diesen Zweck. Der Nachteil ist, dass es nur für MS SQL Server funktioniert. Sie finden dieses Tool hier: https://expressprofiler.codeplex.com/
quelle
Gibt die SQL-Abfrage zurück. Arbeiten mit dem Datenkontext von EntityFramework 6
quelle
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping2[System.Int32,String]]
anstelle der eigentlichen Abfrage. Vermisse ich etwas oder hast du vergessen etwas zu erwähnen?Ich mache einen Integrationstest und benötige diesen, um die generierte SQL-Anweisung in Entity Framework Core 2.1 zu debuggen. Ich verwende
DebugLoggerProvider
oderConsoleLoggerProvider
mag Folgendes:Hier ist eine Beispielausgabe der Visual Studio-Konsole:
quelle
Nekromantie.
Diese Seite ist das erste Suchergebnis bei der Suche nach einer Lösung für ein .NET Framework. Hier also als öffentlicher Dienst, wie es in EntityFramework Core (für .NET Core 1 und 2) gemacht wird:
Und dann diese Erweiterungsmethoden (IQueryableExtensions1 für .NET Core 1.0, IQueryableExtensions für .NET Core 2.0):
quelle
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
In meinem Fall für EF 6+, anstatt dies im Direktfenster zu verwenden, um die Abfragezeichenfolge zu finden:
Ich musste dies letztendlich verwenden, um den generierten SQL-Befehl abzurufen:
Natürlich kann Ihre anonyme Typensignatur anders sein.
HTH.
quelle
Ich habe gerade Folgendes getan:
Und das in der Ausgabe gezeigte Ergebnis :
quelle
Mit EF6 und Visual Studio 2015 habe ich
query
in das unmittelbare Fenster eingegeben und mir die generierte SQL-Anweisung gegebenquelle
Wenn Sie Parameterwerte (nicht nur,
@p_linq_0
sondern auch deren Werte) haben möchten , können Sie die Methode verwendenIDbCommandInterceptor
und der Protokollierung etwas hinzufügenReaderExecuted
.quelle
Obwohl es hier gute Antworten gibt, hat keine mein Problem vollständig gelöst (ich wollte die gesamte SQL-Anweisung, einschließlich der Parameter , aus dem DbContext von jedem IQueryable abrufen. Der folgende Code macht genau das. Es ist eine Kombination von Codefragmenten von Google. I. habe es nur mit EF6 + getestet .
Abgesehen davon hat diese Aufgabe viel länger gedauert, als ich gedacht hatte. Abstraktion im Entity Framework ist meiner Meinung nach ein bisschen viel.
Zuerst die Verwendung. Sie benötigen einen expliziten Verweis auf 'System.Data.Entity.dll'.
Die folgende Klasse konvertiert eine IQueryable in eine DataTable. Ändern Sie sie nach Bedarf:
Nennen Sie es einfach wie folgt:
quelle
Entity Framework 4-Lösung
Die meisten Antworten hier waren EF6-spezifisch. Hier ist eine für diejenigen unter Ihnen, die noch EF4 verwenden.
Diese Methode ersetzt die
@p__linq__0
/ etc. Parameter mit ihren tatsächlichen Werten, sodass Sie die Ausgabe einfach kopieren und in SSMS einfügen und ausführen oder debuggen können.quelle