821 Stimmen

Wie kann ich das vom Entity Framework generierte SQL anzeigen?

Wie kann ich das vom Entity Framework generierte SQL anzeigen?

(In meinem speziellen Fall verwende ich den mysql-Anbieter - falls das eine Rolle spielt)

1144voto

Matt Nibecker Punkte 10939

Wenn Sie Entity Framework 6 und höher verwenden und die SQL-Ausgabe in Visual Studio anzeigen möchten (wie ich es getan habe), 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 Ausgabebereich von Visual Studio ausgegeben:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
    // query the database using EF here.
}

Weitere Informationen zur Protokollierung in EF6 finden Sie in dieser 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.

556voto

Nick Berardi Punkte 53415

Sie können Folgendes tun:

IQueryable query = from x in appEntities
             where x.id == 32
             select x;

var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

oder in EF6:

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query)
            .ToTraceString();

oder in EF6.3+:

var sql = ((dynamic)flooringStoresProducts).Sql;

So erhalten Sie das erzeugte SQL.

100voto

isepise Punkte 1075

Ab EF6.1 können Sie Interceptors verwenden, um einen Datenbanklogger zu registrieren. Siehe Kapitel "Interceptors" und "Protokollierung von Datenbankoperationen" in eine Datei aquí

<interceptors> 
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
      <parameter value="C:\Temp\LogOutput.txt"/> 
      <parameter value="true" type="System.Boolean"/> 
    </parameters> 
  </interceptor> 
</interceptors>

90voto

Doug Clutter Punkte 3512

Wenn Sie einen DbContext verwenden, können Sie wie folgt vorgehen, um das SQL zu erhalten:

var result = from i in myContext.appEntities
             select new Model
             {
                 field = i.stuff,
             };
var sql = result.ToString();

64voto

Josh Withee Punkte 7862

EF-Kern 5.0+

Diese lang ersehnte Funktion ist in EF Core 5.0 verfügbar! Dies ist aus dem Wöchentliche Status-Updates :

var query = context.Set<Customer>().Where(c => c.City == city);
Console.WriteLine(query.ToQueryString())

führt bei Verwendung des SQL Server-Datenbankanbieters zu dieser Ausgabe:

DECLARE p0 nvarchar(4000) = N'London';

SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName],
[c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone],
[c].[PostalCode], [c].[Region]
FROM [Customers] AS [c]
WHERE [c].[City] = @__city_0

Beachten Sie, dass die Deklarationen für Parameter des richtigen Typs auch in der Ausgabe enthalten sind. Dies ermöglicht das Kopieren/Einfügen in SQL Server Management Studio oder ähnlichen Tools, so dass die Abfrage für Debugging/Analyse ausgeführt werden kann.

Juhu!!!

(Hinweis: Sie benötigen using Microsoft.EntityFrameworkCore; )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X