LINQ para iniciantes 6 - Evitando chamadas extras em LINQ

watch_later 2 de jul de 2013

Como evitar chamadas extras em LINQ

Podemos instruir o LINQ para carregar todos os objetos usando DataLoadOptions. Abaixo estão as etapas envolvidas para permitir DataLoadOptions.
A primeira etapa é a de criar a classe DataContext:

DataContext objContext = new DataContext(strConnectionString);

O segundo passo é criar o objeto DataLoadOption:

DataLoadOptions objDataLoadOption = new DataLoadOptions();

Usando o método LoadWith, precisamos definir o que queremos carregar no cliente com o endereço no SQL.

objDataLoadOption.LoadWith<clsCustomerWithAddresses>(
 clsCustomerWithAddresses => clsCustomerWithAddresses.Addresses);

Cada objeto tem um objeto endereço telefone, por isso temos também definimos que os objetos devem ser carregados de telefone para cada objeto endereço no SQL.

objDataLoadOption.LoadWith<clsAddresses>(clsAddresses => clsAddresses.Phone);

Independentemente da opção de carregamento que você definiu, você precisa definir que o objeto DataContext use a propriedade LoadOptions.

objContext.LoadOptions = objDataLoadOption;

Finalmente, prepare sua consulta.

var MyQuery = from objCustomer in objContext.GetTable<clsCustomerWithAddresses>()
select objCustomer;

Comece looping através dos objetos:

foreach (clsCustomerWithAddresses objCustomer in MyQuery)
{
    Response.Write(objCustomer.CustomerName + "<br>");

    foreach (clsAddresses objAddress in objCustomer.Addresses)
    {
        Response.Write("===Address:- " + objAddress.Address1 + "<br />");
        Response.Write("========Mobile:- " + objAddress.Phone.MobilePhone + "<br />");
        Response.Write("========LandLine:- " + objAddress.Phone.LandLine + "<br />");
    }
}

Abaixo está o código-fonte completo:

var objContext = new DataContext(strConnectionString);
var objDataLoadOption = new DataLoadOptions();
objDataLoadOption.LoadWith<clsCustomerWithAddresses>(clsCustomerWithAddresses => clsCustomerWithAddresses.Addresses);
objDataLoadOption.LoadWith<clsAddresses>(clsAddresses => clsAddresses.Phone);
objContext.LoadOptions = objDataLoadOption;
var MyQuery = from objCustomer in objContext.GetTable<clsCustomerWithAddresses>()
select objCustomer;

foreach (clsCustomerWithAddresses objCustomer in MyQuery)
{
    Response.Write(objCustomer.CustomerName + "<br>");

    foreach (clsAddresses objAddress in objCustomer.Addresses)
    {
        Response.Write(Response.Write("===Address:- " + objAddress.Address1 + "<br>");
        Response.Write(Response.Write("========Mobile:- " + objAddress.Phone.MobilePhone + "<br>");
        Response.Write(Response.Write("========LandLine:- " + objAddress.Phone.LandLine + "<br>");
    }
}

Abracadabra .... Agora, se você executar o código, LINQ foi executado apenas uma SQL específica, em comparação com três SQL para cada objeto mostrado anteriormente.

Source code

Execute o projeto e ver como o profiler mostra a execução de um SQL diferente. Você pode executar o primeiro exemplo EntitySet e ver como SQL Profiler reage e, em seguida, executar o exemplo com DataLoadOptions. O script SQL é anexado em um arquivo diferente.
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 :