C# 3.0: Join LINQ

Publicado: 21/08/2008 em C#

Pessoal, no último post, comentei sobre utilizar linq para manipular coleções inclusive usando o operador join para unir resultados de N coleções em apenas um conjunto de dados.
Pois bem, atendendo à pedidos vou dar um exemplo simples de join no LINQ para que vocês possam visualizar como utilizamos mais este de muitos recursos que vem com o C# 3.

Evangelion
Antes de mostrar o exemplo eu vou falar um pouco dos elementos que utilizei nas coleções 😀
Alguém já se perguntou o por quê de Shinji? Shinji é o personagem principal do Animê/Mangá chamado Neon Genesis Evangelion, o qual eu gosto muito (recomendo).

Toda a trama complexa gira em torno de crianças escolhidas para pilotar Evas (Robôs?) para defender a humanidade do fim do mundo.
As três crianças são: Shinji, Asuka (lê-se Aska) e Rei.

Os a princípio chamados de robôs, são os Evas, gigantes munidos de armas e a mais alta tecnologia que a humanidade conhece. Eles são conduzidos em sincronia com os pensamentos das crianças, ou seja, a crinaça pensa em andar e eles andam, eles tem o braço arrancado e a criança recebe o mesmo impulso no cérebro….

1383241388_75ea92447f
Shinji sentado, Askua na escada e Rei em pé
3evas
Eva 02, Eva 01 e Eva 00

 LINQ
Agora que vocês já sabe do que se tratam as nossas coleções, vamos ao exemplo:

Poderíamos utilizar tipos anônimos, mas neste caso é necessário criar duas classe:

    class Pilot
    {
        public string Name { get; set; }
    }

    class Eva
    {
        public string Number { get; set; }
        public Pilot Pilot { get; set; }
    }

Temos uma classe para representar o piloto, e uma para representar o eva, com uma propriedade para o piloto destinado a controlá-lo.
Já que temos as entidades, agora vamos popular duas coleções para que tenhamos dados para trabalhar esta equipe e salvar o mundo eheheh

Pilot[] pilots = {
                                   new Pilot{ Name = "Shinji" },
                                   new Pilot{ Name="Asuka" },
                                   new Pilot{ Name="Rei" }
                               };

            Eva[] evas = {
                                 new Eva{ Number="01", Pilot=pilots[0] },
                                 new Eva{ Number="02", Pilot=pilots[1] },
                                 new Eva{ Number="03", Pilot=pilots[1] },
                                 new Eva{ Number="04", Pilot=pilots[0] },
                                 new Eva{ Number="00", Pilot=pilots[2] }
                             };

Um array de pilotos e um array de Evas, sem muitos segredos aqui, além do novo recurso Object Inializer, onde passamos os valores das propriedades direto na inicialização do objeto, o que permite mais uma opção ao se inicializar um objeto .Net, dispensando às vezes a sobrecarga de construtores.

Vamos à nossa consulta, para unirmos informações vindas das duas coleções sem precisarmos criar uma terceira classe para isto.

var q = from pilot in pilots
                    join eva in evas on pilot equals eva.Pilot
                    select new { Pilot = pilot.Name, Eva = eva.Number };

Reunimos em uma nova entidade o nome do piloto e o respectivo eva de acordo com a referência que fizemos entre pilotos e evas na inicialização dos evas.

Para imprimirmos os resultados:

foreach (var item in q)
            {
                Console.WriteLine(""{0}" pilota o Eva {1}", item.Pilot, item.Eva); 
            }

Obtemos:
"Shinji" pilota o Eva 01
"Shinji" pilota o Eva 04
"Asuka" pilota o Eva 02
"Asuka" pilota o Eva 03
"Rei" pilota o Eva 00

Simples não? E claro é um exemplo extremamente simples.
Para ver mais muitos exemplos de expressões com LINQ para trabalhar os dados vejam os 101 exemplos:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

E para ver mais sobre joins, vejam o LINQ Query Expressions (C# Programming Guide)

Agora sim está completo, espero que tenham gostado e passem a usar muito C# 3.0 e assistir ao Evangelion 😀

Divirtam-se

[]’s
Shinji

Technorati Tags: ,,
Anúncios

Deixe um comentário

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