Linq to SQL – Conceitos Avançados ( Parte 5 ) – Utilizando Compiled Query

Standard

Nesta quinta parte da série estarei falando sobre o uso de uma técnica muito produtiva e padronizada para a compilação de consultas chamado Compiled Query.

É muito comum em diversos sistemas a execução da mesma consulta diversas vezes por diversos usuários, porém, além de bastante improdutivo a repetição destas queries existe o fato da “perca” de desempenho em run-time. Isto devido ao fato que uma série de procedimentos e rotinas internas ocorrem para realizar a transformação destas queries para T-SQL, uma vez repetindo a mesma diversas vezes na aplicação, diversas vezes estes procedimentos internos irão ocorrer.

A fim de melhorar este ponto podemos utilizar a classe Compiled Query, onde compilamos a consulta uma vez e podemos utiliza-la diversas vezes no aplicativo com parâmetros diferentes. No exemplo abaixo demonstro como podemos criar uma consulta compilada:

 

//Instância do DataContext
SerieLinqDB _db = new SerieLinqDB();

//Cria um delegate definindo o tipo do DataContext, o tipo de parâmetro de entrada(string) e o tipo de saída (IQueryable<tbUsuarios>)
Func<SerieLinqDB, string, IQueryable<tbUsuarios>> selecionaUsuariosPorNome;

//Cria a consulta compilada utilizando a classe CompiledQuery
selecionaUsuariosPorNome = CompiledQuery.Compile((SerieLinqDB db, string nome) => from u in db.tbUsuarios where u.none.ToLower().Contains(nome.ToLower()) select u);

IList<tbUsuarios> lista1 = selecionaUsuariosPorNome(_db, "rafa").ToList();
IList<tbUsuarios> lista2 = selecionaUsuariosPorNome(_db, "carlo").ToList();
IList<tbUsuarios> lista3 = selecionaUsuariosPorNome(_db, "frederico").ToList();

 

Observe que primeiramente criamos um delegate para receber nossa consulta compilada, em seguida conseguimos efetuar nossa querie diversas vezes.

Podemos também definir mais parâmetros em nosso delegate, sendo até 4 no máximo antes do nosso tipo de retorno:

 

Func<SerieLinqDB, string, decimal, bool, IQueryable<tbUsuarios>> selecionaUsuariosPorNome;

selecionaUsuariosPorNome = CompiledQuery.Compile((SerieLinqDB db, string nome, decimal salario, bool ativo) => from u in db.tbUsuarios where u.none.ToLower().Contains(nome.ToLower()) && u.ativo == ativo && u.salario == salario select u);

 

 

Leave a Reply

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