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


Login