24sept. 2010

Linq To Entity : Debugger les requêtes SQL générées par Linq To Entity

La suite d'un article que j'avais posté il y a longtemps. J'ai trouvé un bout de code sur StakOverflow qui permet un débuggage plus élégant des reuqêtes Linq To Entity.

Dans mon article précédent la méthode utilisée était peu élégante, et sentait bon le bricolage. Voici quelque de plus pérenne :


// Le séparateur de pour les lignes
private const string debugSeperator =
    "------------------------" 
    + "----------------------" 
    + " ---------------------" 
    + "------------";

public static IQueryable<T> TraceQuery<T>
    (IQueryable<T> query)
{
    if (query != null)
    {
        ObjectQuery<T> objectQuery 
          = query as ObjectQuery<T>;
        if (objectQuery != null 
          && Boolean.Parse(
            ConfigurationManager
              .AppSettings["Debugging"]))
        {

Dans cette première partie, on utilise un appSetting dans le fichier de configuration de l'application. Cette clé ( "Debugging") permet d'activer le debuggage des requetes ou non.

Nous sommes ici dans le cas où le debuggage est activé.

            StringBuilder queryString = new StringBuilder();
            queryString.Append(Environment.NewLine)
                .AppendLine
                  (debugSeperator)
                .AppendLine
                   ("QUERY GENERATED...")
                .AppendLine
                   (debugSeperator)
                .AppendLine
                   (objectQuery.ToTraceString())
                .AppendLine
                   (debugSeperator)
                .AppendLine
                   ("PARAMETERS...")
                .AppendLine
                   (debugSeperator);

Deux éléments important dans cette partie de code : l'utilisation de StringBuilder qui permet d'optimiser la génération de séquences de chaines de caractères et l'utilisation de la méthode ToTraceString qui va retourner la chaine SQL interprétée.

            foreach (ObjectParameter parameter 
              in objectQuery.Parameters)
            {
                queryString.Append
                  (String.Format("{0}({1}) \t- {2}", 
                    parameter.Name, 
                    parameter.ParameterType, 
                    parameter.Value))
                      .Append(Environment.NewLine);
            }
            queryString.AppendLine(debugSeperator)
              .Append(Environment.NewLine);
            Console.WriteLine(queryString);
            Trace.WriteLine(queryString);
        }
    }
    return query;
}

Rien de compliqué dans cette partie, on se contente de parcourir les paramètres de la requête pour les afficher dans la console et la trace.

Source