DataLoadOptions


A utilização da classe DataLoadOptions pelo LINQ To SQL pode ter um grande benefício em termos de performance. Quando estamos efetuando queries que possuem dados relacionados com outras tabelas, esses dados serão carregados sob demanda, ou seja, eles somente serão carregados quando precisarmos efetivamente deles.

Imagine que temos uma tabela Cliente e uma tabela Telefone, onde a segunda possui uma coluna chamada ClienteId que liga o telefone ao cliente. Para percorrer os clientes e exibir a quantidade de telefones que cada um deles tem cadastrado, podemos executar o seguinte código:

foreach (Cliente c in ctx.Clientes)
{
    Console.WriteLine(c.Nome);
    Console.WriteLine(c.Telefones.Count);
}

Ao visualizar os logs no SQL Profiler, veremos que duas queries chegam até ele, sendo uma para capturar o cliente e a outra para extrair os telefones que ele possui:

SELECT [t0].[ClienteId], [t0].[Nome]
FROM [dbo].[Cliente] AS [t0]

exec sp_executesql N‘SELECT [t0].[ClienteId], [t0].[Tipo], [t0].[Numero]
FROM [dbo].[Telefone] AS [t0]
WHERE [t0].[ClienteId] = @p0′
,N’@p0 int’,@p0=1

Com a utilização da classe DataLoadOptions, podemos especificar quais dados queremos carregar juntamente com o registro principal que, no nosso caso, são os telefones do cliente. Basicamente, precisamos instanciar esta classe e, via método LoadWith, especificamos a entidade alvo (Cliente) e, como parametro, definimos qual campo ou propriedade queremos carregar. Isso é mostrado a partir do código abaixo:

DataLoadOptions opts = new DataLoadOptions();
opts.LoadWith<Cliente>(c => c.Telefones);
ctx.LoadOptions = opts;

foreach (Cliente c in ctx.Clientes)
{
    Console.WriteLine(c.Nome);
    Console.WriteLine(c.Telefones.Count);
}

Depois da instancia da classe DataLoadOptions criada e configurada, basta definirmos a mesma na propriedade LoadOptions do contexto do LINQ To SQL. Ao executar este código, apenas uma única query será encaminhada para o SQL Server, mas preparada para extrair todos os dados:

SELECT [t0].[ClienteId], [t0].[Nome], [t1].[ClienteId] AS [ClienteId2], [t1].[Tipo], [t1].[Numero], (
    SELECT COUNT(*)
    FROM [dbo].[Telefone] AS [t2]
    WHERE [t2].[ClienteId] = [t0].[ClienteId]
    ) AS [value]
FROM [dbo].[Cliente] AS [t0]
LEFT OUTER JOIN [dbo].[Telefone] AS [t1] ON [t1].[ClienteId] = [t0].[ClienteId]
ORDER BY [t0].[ClienteId], [t1].[Tipo], [t1].[Numero]

Anúncios

Deixe uma resposta

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