Escolar Documentos
Profissional Documentos
Cultura Documentos
LINQ to Objects permite aos desenvolvedores da plataforma .NET escrever "consultas" sobre coleções de objetos. Para facilitar a
Microsoft fornece um grande conjunto de operadores de consulta, e esses operadores oferecem uma profundidade semelhante à
funcionalidade que temos com a linguagem SQL trabalhando com banco de dados relacional.
Neste artigo vamos rever alguns conceitos chaves da LINQ to Objects e mostrar na prática a sua utilização criando consultas em coleções de objetos para lembrar a
sintaxe usada nessas operações.
Nota: Não Confunda LINQ to Objects com LINQ to Entities, elas são diferentes.
Tradicionalmente, trabalhar com coleções de objetos significava escrever um monte de código usando laços for ou foreach para percorrer a coleção, usar ifs para
filtrar durante a execução e manter uma soma parcial de uma propriedade total.
A LINQ nos libera de ter que escrever o código usando muitos laços; ela permite escrever consultas que filtram uma lista que façam cálculos usando funções de
agregação de elementos em uma coleção em memória.
Podemos escrever consultas contra qualquer tipo de coleção que implementa uma interface IEnumerable<T>, o que a grande parte das classes de coleções da
plataforma .NET implementa, inclusive os arrays.
Objetivos
Aprendizado
Recursos usados
http://www.macoratti.net/14/07/lnq_cco1.htm 1/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
Abra o Visual Studio 2013 Express for Windows Desktop e clique em New Project;
Selecione o template Visual C# -> Windows -> Console Application e informe o nome LINQ_Objects_2 e clique em OK;
Contato.vb - Classe que contém informações sobre contatos : Nome, Sobrenome, Email, Telefone, Nascimento e Estado
LogChamadas.vb - Classe que contém informações sobre ligações telefônicas : Numero, Duracao, Recebida, Data
No menu PROJECT clique em Add Class e informe o nome Contato.vb e a seguir inclua o seguinte código nesta classe:
http://www.macoratti.net/14/07/lnq_cco1.htm 2/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
.Email = "bruno@net.com.br", _
.Estado = "MG" _
}, _
New Contato() With { Nome = "Mario", .Sobrenome = "Ferreira", .Nascimento = New DateTime(1977, 9, 17), .Telefone = "9902 3644", .Email = "mariofer@net.com.br", .Estado = "RS" _
}, _
New Contato() With { .Nome = "Ariel", .Sobrenome = "Santos", .Nascimento = New DateTime(1962, 5, 23), .Telefone = "9837 1656", .Email = "ariel@net.com.br", .Estado = "RJ" _
} _
}
End Function
End Class
Na classe Contato declaramos 6 propriedades e definimos os dados para uma coleção de objetos do tipo Contato a ser criada em memória.
A seguir, menu PROJECT clique em Add Class e informe o nome LogChamadas.vb e a seguir inclua o seguinte código nesta classe:
http://www.macoratti.net/14/07/lnq_cco1.htm 3/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
.Recebida = False, _
.Data = New DateTime(2014, 8, 7, 10, 35, 0) _
}, _
New LogChamadas() With { _
.Numero = "9907 5462", _
.Duracao = 4, _
.Recebida = True, _
.Data = New DateTime(2014, 8, 7, 11, 15, 0) _
}, _
New LogChamadas() With { _
.Numero = "9553 8487", _
.Duracao = 15, _
.Recebida = False, _
.Data = New DateTime(2014, 8, 7, 13, 12, 0) _
}, _
New LogChamadas() With { _
.Numero = "9553 8487", _
.Duracao = 3, _
.Recebida = True, _
.Data = New DateTime(2014, 8, 7, 13, 47, 0) _
}, _
New LogChamadas() With { _
.Numero = "9907 5462", _
.Duracao = 1, _
.Recebida = False, _
.Data = New DateTime(2014, 8, 7, 20, 34, 0) _
}, _
New LogChamadas() With { _
.Numero = "9907 5462", _
.Duracao = 3, _
.Recebida = False, _
.Data = New DateTime(2014, 8, 8, 10, 10, 0) _
}, _
New LogChamadas() With { _
.Numero = "8303 6030", _
.Duracao = 23, _
.Recebida = False, _
.Data = New DateTime(2014, 8, 8, 10, 40, 0) _
}, _
New LogChamadas() With { _
.Numero = "9918 2789", _
.Duracao = 3, _
.Recebida = False, _
.Data = New DateTime(2014, 8, 8, 14, 0, 0) _
http://www.macoratti.net/14/07/lnq_cco1.htm 4/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
}, _
New LogChamadas() With { _
.Numero = "9918 2789", _
.Duracao = 7, _
.Recebida = True, _
.Data = New DateTime(2014, 8, 8, 14, 37, 0) _
}, _
New LogChamadas() With { _
.Numero = "9902 3644", _
.Duracao = 6, _
.Recebida = True, _
.Data = New DateTime(2014, 8, 8, 15, 23, 0) _
}, _
New LogChamadas() With { _
.Numero = "9602 6774", _
.Duracao = 20, _
.Recebida = True, _
.Data = New DateTime(2014, 8, 8, 17, 12, 0) _
}, _
New LogChamadas() With { _
.Numero = "9553 8487", _
.Duracao = 5, _
.Recebida = True, _
.Data = New DateTime(2014, 7, 12, 8, 12, 0) _
}, _
New LogChamadas() With { _
.Numero = "8999 1154", _
.Duracao = 12, _
.Recebida = True, _
.Data = New DateTime(2014, 6, 14, 9, 23, 0) _
}, _
New LogChamadas() With { _
.Numero = "9602 6774", _
.Duracao = 10, _
.Recebida = False, _
.Data = New DateTime(2014, 7, 9, 10, 5, 0) _
}, _
New LogChamadas() With { _
.Numero = "8303 6030", _
.Duracao = 22, _
.Recebida = False, _
.Data = New DateTime(2014, 7, 5, 10, 35, 0) _
}, _
New LogChamadas() With { _
http://www.macoratti.net/14/07/lnq_cco1.htm 5/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
.Numero = "9907 5462", _
.Duracao = 9, _
.Recebida = True, _
.Data = New DateTime(2014, 6, 7, 11, 15, 0) _
}, _
New LogChamadas() With { _
.Numero = "9553 8487", _
.Duracao = 10, _
.Recebida = False, _
.Data = New DateTime(2014, 6, 7, 13, 12, 0) _
}, _
New LogChamadas() With { _
.Numero = "9553 8487", _
.Duracao = 21, _
.Recebida = True, _
.Data = New DateTime(2014, 7, 7, 13, 47, 0) _
}, _
New LogChamadas() With { _
.Numero = "9907 5462", _
.Duracao = 7, _
.Recebida = False, _
.Data = New DateTime(2014, 7, 7, 20, 34, 0) _
}, _
New LogChamadas() With { _
.Numero = "9907 5462", _
.Duracao = 2, _
.Recebida = False, _
.Data = New DateTime(2014, 6, 8, 10, 10, 0) _
}, _
New LogChamadas() With { _
.Numero = "8303 6030", _
.Duracao = 3, _
.Recebida = False, _
.Data = New DateTime(2014, 6, 8, 10, 40, 0) _
}, _
New LogChamadas() With { _
.Numero = "9918 2789", _
.Duracao = 32, _
.Recebida = False, _
.Data = New DateTime(2014, 7, 8, 14, 0, 0) _
}, _
New LogChamadas() With { _
.Numero = "9918 2789", _
.Duracao = 13, _
http://www.macoratti.net/14/07/lnq_cco1.htm 6/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
.Recebida = True, _
.Data = New DateTime(2014, 7, 8, 14, 37, 0) _
}, _
New LogChamadas() With { _
.Numero = "9902 3644", _
.Duracao = 16, _
.Recebida = True, _
.Data = New DateTime(2014, 5, 8, 15, 23, 0) _
}, _
New LogChamadas() With { _
.Numero = "9602 6774", _
.Duracao = 24, _
.Recebida = True, _
.Data = New DateTime(2014, 6, 8, 17, 12, 0) _
} _
}
End Function
End Class
Na classe LogChamadas declaramos 4 propriedades e definimos os dados para uma coleção de objetos do tipo LogChamadas a ser criada em memória que representa
as ligações feitas pelos contatos. Existem portanto uma relação entre as duas classes que iremos usar para realizar a junção entre as coleções.
No arquivo Module1.vb da nossa solução vamos declarar a chamada para 4 métodos que serão criados posteriormente conforme o código a seguir:
Sub Main()
Exemplo1()
'Exemplo2()
'Exemplo3()
'Exemplo4()
End Sub
A seguir vamos criar um método que irá ser executado em todas as consultas e que irá criar um pequeno cabeçalho para identificar a consulta:
http://www.macoratti.net/14/07/lnq_cco1.htm 7/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
Console.WriteLine("--------------------------------------------------")
Console.WriteLine("")
End Sub
Dim q = From c In contatos Where c.Nascimento.AddYears(45) > DateTime.Now Order By c.Nascimento Descending
Select String.Format("{0} {1} , nascimento : {2}", c.Nome, c.Sobrenome, c.Nascimento.ToString("dd-MMM-yyyy"))
Console.ReadKey()
End Sub
Observe que na cláusula Select usamos o método String.Format() para formatar a saída a consulta.
2- Além de filtrar itens em uma coleção e projetar os resultados, a LINQ oferece a capacidade de agrupar os itens de coleta em qualquer forma que você
precisar. Nesta consulta agrupamos os contatos por Estado de origem:
Console.ReadKey()
End Sub
http://www.macoratti.net/14/07/lnq_cco1.htm 8/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
3- Um aspecto fundamental no acesso aos dados relacionados é o conceito de junção dos dados relacionados.
Os Sistemas de banco de dados relacional (como o Microsoft SQL Server) têm um poderoso recursos para realizar junções que permitem escrever consultas contra
dados normalizados, o que é um termo chique para a "não repetir os dados" por separar os dados entre várias tabelas vinculando-os com um valor comum.
A LINQ permite fazer a junção(join) de várias coleções de objetos em conjunto, utilizando a sintaxe similar à SQL, como vemos na consulta a seguir:
Console.ReadKey()
End Sub
4- Para demonstrar o poder da LINQ to Objects a consulta a seguir totaliza os dados a partir de duas coleções em memória usando junções, agrupamentos e
ainda os operadores agregados (SUM, COUNT, AVG, etc.) na cláusula Select :
http://www.macoratti.net/14/07/lnq_cco1.htm 9/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
Order By contato.Nome, contato.Sobrenome
Select New With { _
contato.Nome, _
contato.Sobrenome, _
.Conta = lig.Count(), _
.Media = lig.Average(Function(c) c.Duracao), _
.Total = lig.Sum(Function(c) c.Duracao) _
}
Percebeu que de forma quase intuitiva criamos as consultas usando a sintaxe do LINQ to Objects em coleções de memórias.
João 3:21 Mas quem pratica a verdade vem para a luz, a fim de que seja manifesto que as suas obras são feitas em Deus. (disse Jesus)
Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !
Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...
Quer aprender C# ??
Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.
http://www.macoratti.net/14/07/lnq_cco1.htm 10/11
20/04/2018 LINQ to Objects - Realizando Consulta em Coleções de objetos
http://www.macoratti.net/14/07/lnq_cco1.htm 11/11