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

 
Rafael Zaccanini
MTAC – Microsoft Technical Audience Contributor

Blog: http://www.rafaelzaccanini.net
Twitter: 
@rafaelzaccanini
Facebook: http://www.facebook.com/RafaelZaccaniniNet