LINQ para iniciantes 12 - CompiledQuery Consultas Compiladas

watch_later 11 de jul de 2013

O que são querys compiladas?

O Motor do LINQ nos proporciona algo chamado CompiledQuery. As CompiledQuery são armazenadas em cache em uma classe estática. Como nós sabemos, uma classe estática é um cache global. Então LINQ usa o plano de consulta do objeto de classe estática ao invés de construir e preparar o plano de consulta a partir do zero.
Ao todo, existem quatro etapas que precisam ser executadas desde o momento em consultas LINQ são construídos até que eles sejam demitidos. Usando LINQ CompiledQuery estes quatro passos são reduzidos a dois passos.

Quais são as diferentes etapas envolvidas na escrita de consultas CompiledQuery?

A primeira coisa é a fazer é adicionar referência ao namespace Data.Linq e adicionar o using em seu código.

using System.Data.Linq

A sintaxe para escrever querys compiladas é um pouco enigmática. Por isso, vamos quebrar essa sintaxe em pequenos pedaços e tentar ver como a sintaxe completa se parece. Para executar uma query compilada, precisamos escrever um ponteiro. Esta função deve ser estática para que o framework do LINQ possa usar o plano de consulta armazenado nesses objetos de classe estáticos. Abaixo, veja como podemos definir a função. Ela começa com public static dizendo que é uma função estática. Então nós usamos a palavra-chave Func para definir os parâmetros de entrada e os parâmetros de saída. Segue-se a forma como a sequência de parâmetro deve ser definida
- O primeiro parâmetro deve ser um contexto de dados. Então, nós definimos o tipo de dados como DataContext.
- Seguido por um ou vários parâmetros de entrada, atualmente temos apenas um, ou seja, o código do cliente, por isso temos definido o segundo tipo de dados do parâmetro como string.
- Uma vez que definimos os parâmetros de entrada, precisamos definir agora o tipo de retorno dos dados. Atualmente definimos o tipo de dados de saída como IQueryable.
Chamamos uma Func chamada getCustomers.

public static Func<DataContext, string, IQueryable<clsCustomerEntity>> getCustomers

Precisamos chamar o método Compilado de CompiledQuery na classe estática com o objeto DataContext e os parâmetros de entrada definidos seguido pela consulta LINQ. No trecho abaixo, ainda não especifiquei a consulta completa para separar bem as partes para um melhor entendimento do código:

CompiledQuery.Compile((DataContext db, stringstrCustCode)=> Your LINQ Query );

Combinando os dois trechos de código acima, temos o seguinte trecho de código:

public static Func<DataContext, string, IQueryable<clsCustomerEntity>>
  getCustomers= CompiledQuery.Compile((DataContext db, string strCustCode)=> Your LINQ Query );

Depois, temos que colocar essa função estática em uma classe estática. Adicionando nossa função estática em uma classe teremos o seguinte código.

public static class clsCompiledQuery
{
    public static Func<DataContext, string, IQueryable<clsCustomerEntity>>
    getCustomers = CompiledQuery.Compile((DataContext db, string strCustCode)
    => from objCustomer in db.GetTable<clsCustomerEntity>()
    where objCustomer.CustomerCode == strCustCode
    select objCustomer);
}

Executar a query compilada é muito simples, é só chamarmos a função estática. Atualmente esta função está retornando tipo de dados IEnumerable. Então nós temos que definir uma entidade cliente IEnumerable que será carregada através da FUNC getCustomers. Podemos percorrer a entidade cliente usando a classe clsCustomerEntity.

IQueryable<clsCustomerEntity> objCustomers = 
             clsCompiledQuery.getCustomers(objContext, txtCustomerCode.Text);
foreach (clsCustomerEntity objCustomer in objCustomers)
{
    Response.Write(objCustomer.CustomerName + "<br>");
}

Obviamente temos outras formas de executar CompiledQuery , este é apenas um de muitos exemplos para fazer isso no LINQ.
Bom galera , ficamos por aqui a abaixo estão os links das postagens da mesma série , espero que seja útil ,qualquer dúvida comente , ou mande email para contato@virtualbase.com.br

Lista de Postagens da série LINQ PARA INICIANTES :