Question Comment afficher le code SQL généré par Entity Framework?


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)


489
2017-09-11 19:33


origine


Réponses:


Vous pouvez faire ce qui suit:

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

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

ou dans EF6:

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

Cela vous donnera le SQL qui a été généré.


409
2017-09-11 19:42



Pour ceux qui utilisent Entity Framework 6 et plus, si vous voulez voir la sortie SQL dans Visual Studio (comme je l'ai fait), vous devez utiliser la nouvelle fonctionnalité de journalisation / interception.

L'ajout de la ligne suivante va générer le code SQL généré (ainsi que des détails supplémentaires liés à l'exécution) dans le panneau de sortie de Visual Studio:

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

Plus d'informations sur la connexion à 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 d’exécuter votre projet en mode DEBUG.


781
2017-12-23 21:53



Si vous utilisez un DbContext, vous pouvez effectuer les opérations suivantes pour obtenir le SQL:

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

71
2017-10-11 18:19



À partir de EF6.1, vous pouvez utiliser les intercepteurs pour enregistrer un enregistreur de base de données. Voir les chapitres "Interceptors" et "Logging Database Operations" dans un fichier ici

<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>

68
2017-07-07 07:02



Il y a deux façons:

  1. Pour voir le SQL qui sera généré, appelez simplement ToTraceString(). Vous pouvez l'ajouter dans votre fenêtre de surveillance et définir un point d'arrêt pour voir quelle sera la requête à un moment donné pour toute requête LINQ.
  2. Vous pouvez attacher un traceur à votre serveur SQL de choix, qui vous montrera la requête finale dans tous ses détails. Dans le cas de MySQL, le moyen le plus simple de suivre les requêtes consiste simplement à suivre le journal des requêtes avec tail -f. Vous pouvez en apprendre plus sur les fonctions de journalisation de MySQL dans la documentation officielle. Pour SQL Server, le plus simple est d'utiliser le profileur SQL Server inclus.

14
2017-09-11 19:37



Vous pouvez effectuer les opérations suivantes dans EF 4.1:

var result = from x in appEntities
             where x.id = 32
             select x;

System.Diagnostics.Trace.WriteLine(result .ToString());

Cela vous donnera le SQL qui a été généré.


14
2017-09-01 08:48



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à fournies.

Toute commande envoyée depuis l'EF vers la base de données peut maintenant être enregistrée. Pour afficher les requêtes générées à partir de EF 6.x, utilisez le DBContext.Database.Log property

Ce qui est enregistré

 - SQL for all different kinds of commands. For example:
    - Queries, including normal LINQ queries, eSQL queries, and raw queries from methods such as SqlQuery.
    - Inserts, updates, and deletes generated as part of SaveChanges
    - Relationship loading queries such as those generated by lazy loading
 - Parameters
 - Whether or not the command is being executed asynchronously
 - A timestamp indicating when the command started executing
 - Whether or not the command completed successfully, failed by throwing an exception, or, for async, was canceled
 - Some indication of the result value
 - The approximate amount of time it took to execute the command. Note that this is the time from sending the command to getting the result object back. It does not include time to read the results.

Exemple:

using (var context = new BlogContext()) 
{ 
    context.Database.Log = Console.Write; 

    var blog = context.Blogs.First(b => b.Title == "One Unicorn"); 

    blog.Posts.First().Title = "Green Eggs and Ham"; 

    blog.Posts.Add(new Post { Title = "I do not like them!" }); 

    context.SaveChangesAsync().Wait(); 
}

Sortie:

SELECT TOP (1)
    [Extent1].[Id] AS [Id],
    [Extent1].[Title] AS [Title]
    FROM [dbo].[Blogs] AS [Extent1]
    WHERE (N'One Unicorn' = [Extent1].[Title]) AND ([Extent1].[Title] IS NOT NULL)
-- Executing at 10/8/2013 10:55:41 AM -07:00
-- Completed in 4 ms with result: SqlDataReader

SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Title] AS [Title],
    [Extent1].[BlogId] AS [BlogId]
    FROM [dbo].[Posts] AS [Extent1]
    WHERE [Extent1].[BlogId] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int32)
-- Executing at 10/8/2013 10:55:41 AM -07:00
-- Completed in 2 ms with result: SqlDataReader

UPDATE [dbo].[Posts]
SET [Title] = @0
WHERE ([Id] = @1)
-- @0: 'Green Eggs and Ham' (Type = String, Size = -1)
-- @1: '1' (Type = Int32)
-- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00
-- Completed in 12 ms with result: 1

INSERT [dbo].[Posts]([Title], [BlogId])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[Posts]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: 'I do not like them!' (Type = String, Size = -1)
-- @1: '1' (Type = Int32)
-- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00
-- Completed in 2 ms with result: SqlDataReader

Pour vous connecter à un fichier externe:

using (var context = new BlogContext()) 
{  
    using (var sqlLogFile = new StreamWriter("C:\\temp\\LogFile.txt"))
    {          
         context.Database.Log = sqlLogFile.Write;     
         var blog = context.Blogs.First(b => b.Title == "One Unicorn"); 
         blog.Posts.First().Title = "Green Eggs and Ham"; 
         context.SaveChanges();
   }
}

Plus d'infos ici: Journalisation et interception des opérations de base de données


12
2017-08-16 09:44



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/


4
2017-12-23 09:19



IQueryable query = from x in appEntities
                   where x.id = 32
                   select x;
var queryString = query.ToString();

Va retourner la requête SQL. Utilisation du contexte de données d'EntityFramework 6


4
2017-10-20 07:55