web-dev-qa-db-fra.com

Obtenir une requête SQL de LINQ à SQL?

J'ai une requête que je passe byte[] en tant que paramètre. J'essaie d'extraire la requête SQL et de l'exécuter dans Studio de gestion pour déboguer. Comment puis-je en extraire l'instruction SQL?

 committeeMember =
           db.Committee_Member.FirstOrDefault(x => x.Customer_Number == activity.Contact.Number
           && x.Position_Start_Date.Value.Year == activity.EndDate
           && x.Committee_Id == activity.Committee.Id && x.Cancelled != 1);
38
James123

Dans le débogueur, passez la souris sur la variable commiteeMember pour afficher la requête SQL générée:

enter image description here

C'est ce que ToString() renvoie pour une requête. Vous pouvez obtenir la même requête SQL générée manuellement en appelant ToString:

string sql = committeeMember.ToString();

Cette méthode surchargée appelle en interne ObjectQuery.ToTraceString() qui renvoie des commandes qui seront exécutées sur une source de données.


Vous pouvez également utiliser SQL Profiler ou Entity Framework Profiler pour voir quelle requête SQL a été exécutée.

72
Sergey Berezovskiy

Incidemment, LINQ to SQL n'est pas une structure d'entité. Si c'est le cas, vous pouvez définir [yourDataContext].Log = Console.Out (ou n autre rédacteur de flux ) et obtenir la requête.

Dans votre requête, pensez à l'écrire comme suit pour pouvoir exécuter l'astuce ToString:

var committeeMemberQuery =
           db.Committee_Member.*WHERE*
           (x => 
              x.Customer_Number == activity.Contact.Number
                 && x.Position_Start_Date.Value.Year == activity.EndDate
                 && x.Committee_Id == activity.Committee.Id && x.Cancelled != 1
           );

var committeeMember = committeeMemberQuery.FirstOrDefault();

Vous pouvez maintenant faire committeeMemberQuery.ToString() mais vous n'obtiendrez pas d'informations sur les paramètres (vous obtiendrez DataContext.Log = Console.Out mais là encore, ce n'est pas Entity Framework, c'est LINQ to SQL.

15
Mark Sowul