Linq to SQL – Catalogando Log (SQL query/Command) do Linq em arquivos externos

Standard

Um recurso bem interessante que temos no Linq (toSQL e Entity), é a possibilidade de catalogar e analisar as queries que são geradas. Ou seja, como o linq gerencia a forma de geração do código SQL/command a ser executado efetivamente na base de dados, podemos com este recurso, verificar se nossa query linq está sendo processada da melhor forma possível e com a melhor performance.

Para tanto, vamos primeiramente criar uma estrutura para a realização de uma query bem simples, veja:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Cria contexto de dados
DBDataContext _db = new DBDataContext();

// Efetua uma query
var query = from p in _db.Produtos
where p.valor.HasValue
select p;

// Registra LOG com a query gerada pelo LINQ
_db.Log = new LogQueryLinq();

// Percorre a query e mostra ao usuário cada produto
foreach (var p in query)
Console.WriteLine(string.Format("Produto:{0} | Valor Total{1}", p.nome, p.valor ));

Em seguida, vamos analisar a propriedade Log presente dentro de nossa instância do DataContext, veja na imagem abaixo que ele aguarda um objeto do tipo System.IO.TextWriter para que possa escrever nosso resultado da query.

Vamos em seguida implementar uma classe para que auxilie este processo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///
/// Classe de auxílio para registrar LOGs de query result do Linq
///
class LogQueryLinq : System.IO.TextWriter
{
   public override void Write(char[] buffer, int index, int count)
   {
      System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value)
   {
      System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding
   {
      get { return System.Text.Encoding.UTF8; }
   }
}

Observe que nossa classe deve implementar a classe abstrata System.IO.TextWriter. Com isso, podemos facilmente fazer algo como:

Finalmente, basta configurarmos em nosso arquivo *.config as definições de system.diagnostics, veja:

1
2
3
4
5
6
7
8
9
<!--Utilizado para registrar o LOG com a query gerada pelo LINQ-->
<system.diagnostics>
  <trace autoflush="true" indentsize="4">
    <listeners>
      <remove name="Default" />
      <add name="LogQueryLinq" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:LogQueryLinq.log" />
    </listeners>
  </trace>
</system.diagnostics>

Pronto, agora após rodarmos nossa aplicação, se abrirmos o arquivo LogQueryLinq.log podemos analisar a query gerada pelo Linq:

Leave a Reply

Your email address will not be published. Required fields are marked *