RSS

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

20 dez

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

Anúncios
 
Deixe um comentário

Publicado por em 20/12/2011 em Linq

 

Tags: , , , ,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: