Comment afficher le SQL généré par le framework d'entité?
(Dans mon cas particulier, j'utilise le fournisseur mysql - si cela est important)
Comment afficher le SQL généré par le framework d'entité?
(Dans mon cas particulier, j'utilise le fournisseur mysql - si cela est important)
Réponses:
Vous pouvez effectuer les opérations suivantes:
ou dans EF6:
Cela vous donnera le SQL qui a été généré.
la source
.Single()
votre objet n'est plus,IQueryable
je suppose.result
àSystem.Data.Entity.Infrastructure.DbQuery<T>
, puis obtenir la propriété interneInternalQuery
comme(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, et alors seulement, l' utilisationToTraceString()
result.ToString()
Pour ceux qui utilisent Entity Framework 6 et plus, si vous souhaitez afficher le SQL de sortie dans Visual Studio (comme je l'ai fait), vous devez utiliser la nouvelle fonctionnalité de journalisation / interception.
L'ajout de la ligne suivante crachera le SQL généré (ainsi que des détails supplémentaires liés à l'exécution) dans le panneau de sortie de Visual Studio:
Plus d'informations sur la connexion dans EF6 dans cette série de blogs astucieux: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Remarque: assurez-vous que vous exécutez votre projet en mode DEBUG.
la source
À partir d'EF6.1, vous pouvez utiliser des intercepteurs pour enregistrer un enregistreur de base de données. Voir les chapitres "Intercepteurs" et "Journalisation des opérations de base de données" dans un fichier ici
la source
Si vous utilisez un DbContext, vous pouvez effectuer les opérations suivantes pour obtenir le SQL:
la source
ToString()
vous donnera la requête avec des variables, commep__linq__0
, au lieu des valeurs finales (par exemple: 34563 au lieu dep__linq__0
)Applicable pour EF 6.0 et supérieur: pour ceux d'entre vous qui souhaitent en savoir plus sur la fonctionnalité de journalisation et ajouter à certaines des réponses déjà données.
Toute commande envoyée par l'EF à la base de données peut maintenant être enregistrée. Pour afficher les requêtes générées à partir d'EF 6.x, utilisez le
DBContext.Database.Log property
Ce qui est enregistré
Exemple:
Production:
Pour vous connecter à un fichier externe:
Plus d'informations ici: Journalisation et interception des opérations de base de données
la source
Vous pouvez effectuer les opérations suivantes dans EF 4.1:
Cela vous donnera le SQL qui a été généré.
la source
ToString()
sortie est l'espace de noms de ce type personnalisé. Par exemple, si le code ci-dessus étaitselect new CustomType { x = x.Name }
, la valeur retournée serait quelque chose commeCompany.Models.CustomType
au lieu du SQL généré.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
pour moi.Ma réponse concerne le noyau EF . Je fais référence à ce problème de github et aux documents sur la configuration
DbContext
:Facile
Remplacez la
OnConfiguring
méthode de votreDbContext
classe (YourCustomDbContext
) comme indiqué ici pour utiliser un ConsoleLoggerProvider; vos requêtes doivent se connecter à la console:Complexe
Ce cas complexe évite de surcharger la
DbContext
OnConfiguring
méthode. , ce qui est déconseillé dans la documentation: "Cette approche ne se prête pas aux tests, à moins que les tests ne ciblent la base de données complète."Ce cas complexe utilise:
IServiceCollection
inStartup
classConfigureServices
(au lieu de remplacer laOnConfiguring
méthode; l'avantage est un couplage plus lâche entre leDbContext
et le queILoggerProvider
vous souhaitez utiliser)ILoggerProvider
(au lieu d'utiliser l'ConsoleLoggerProvider
implémentation indiquée ci-dessus; l'avantage est que notre implémentation montre comment nous nous connecterions à File (je ne vois pas de fournisseur d' enregistrement de fichiers livré avec EF Core ))Comme ça:
Voici la mise en œuvre d'un
MyLoggerProvider
(et sonMyLogger
qui ajoute ses journaux à un fichier que vous pouvez configurer; vos requêtes EF Core apparaîtront dans le fichier.)la source
Il y a deux façons:
ToTraceString()
. Vous pouvez l'ajouter dans votre fenêtre de surveillance et définir un point d'arrêt pour voir quelle serait la requête à tout moment donné pour n'importe quelle requête LINQ.tail -f
. Vous pouvez en savoir plus sur les fonctionnalités de journalisation de MySQL dans la documentation officielle . Pour SQL Server, le moyen le plus simple consiste à utiliser le profileur SQL Server inclus.la source
Pour que la requête soit toujours à portée de main, sans modifier le code, ajoutez-la à votre DbContext et vérifiez-la dans la fenêtre de sortie de Visual Studio.
Semblable à la réponse de @Matt Nibecker, mais avec cela, vous n'avez pas à l'ajouter dans votre code actuel, chaque fois que vous avez besoin de la requête.
la source
SQL Management Studio => Outils => Profileur SQL Server
Fichier => Nouvelle trace ...
Utilisez le modèle => Blank
Sélection d'événement => T-SQL
Contrôle à gauche pour: SP.StmtComplete
Les filtres de colonne peuvent être utilisés pour sélectionner un ApplicationName ou DatabaseName spécifique
Démarrez ce profil en cours d'exécution, puis lancez la requête.
Cliquez ici pour les informations sur la source
la source
Eh bien, j'utilise Express profiler à cet effet pour le moment, l'inconvénient est qu'il ne fonctionne que pour MS SQL Server. Vous pouvez trouver cet outil ici: https://expressprofiler.codeplex.com/
la source
Renvoie la requête SQL. Utilisation du contexte de données d'EntityFramework 6
la source
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping2[System.Int32,String]]
au lieu de la requête réelle. Suis-je en train de manquer quelque chose ou avez-vous oublié de mentionner quelque chose?Je fais un test d'intégration, et j'en avais besoin pour déboguer l'instruction SQL générée dans Entity Framework Core 2.1, donc j'utilise
DebugLoggerProvider
ouConsoleLoggerProvider
j'aime:Voici un exemple de sortie de la console Visual Studio:
la source
Nécromancement.
Cette page est le premier résultat de recherche lorsque vous recherchez une solution pour n'importe quel .NET Framework, alors voici en tant que service public, comment cela se fait dans EntityFramework Core (pour .NET Core 1 et 2):
Et puis ces méthodes d'extension (IQueryableExtensions1 pour .NET Core 1.0, IQueryableExtensions pour .NET Core 2.0):
la source
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
Dans mon cas pour EF 6+, au lieu d'utiliser ceci dans la fenêtre immédiate pour trouver la chaîne de requête:
J'ai fini par devoir l'utiliser pour obtenir la commande SQL générée:
Bien sûr, votre signature de type anonyme peut être différente.
HTH.
la source
Je viens de faire ça:
Et le résultat affiché dans la sortie :
la source
Pour moi, en utilisant EF6 et Visual Studio 2015, je suis entré
query
dans la fenêtre immédiate et cela m'a donné l'instruction SQL généréela source
Si vous souhaitez également avoir des valeurs de paramètre (non seulement,
@p_linq_0
mais aussi leurs valeurs), vous pouvez utiliserIDbCommandInterceptor
et ajouter une journalisation à laReaderExecuted
méthode.la source
Bien qu'il existe de bonnes réponses ici, aucune n'a résolu mon problème complètement (je souhaitais obtenir l'intégralité de l'instruction SQL, y compris les paramètres , à partir du DbContext à partir de n'importe quel IQueryable. Le code suivant fait exactement cela. Il s'agit d'une combinaison d'extraits de code de Google. I l'ont testé qu'avec EF6 + .
Soit dit en passant, cette tâche m'a pris beaucoup plus de temps que je ne le pensais. L'abstraction dans Entity Framework est un peu trop, à mon humble avis.
D'abord l'utilisation. Vous aurez besoin d'une référence explicite à «System.Data.Entity.dll».
La classe suivante convertit un IQueryable en un DataTable. Modifiez selon vos besoins:
Pour l'utiliser, il suffit de l'appeler comme ci-dessous:
la source
Solution Entity Framework 4
La plupart des réponses ici étaient spécifiques à EF6. En voici une pour ceux d'entre vous qui utilisent encore EF4.
Cette méthode remplace le
@p__linq__0
/ etc. paramètres avec leurs valeurs réelles, vous pouvez donc simplement copier et coller la sortie dans SSMS et l'exécuter ou la déboguer.la source