Primeiras aulas do curso Entity LinQ parte 1: Crie queries poderosas em C#

Entity LinQ parte 1: Crie queries poderosas em C#

Linq to Objects - Introdução ao curso

A proposta do presente curso é criar diversos tipos de consultas para uma loja virtual que vende músicas digitais pela Internet. Veremos desde uma consulta básica até buscas mais elaboradas em bancos de dados. Neste curso será possível observar também como uma consulta de tipo LINQ se parece com uma consulta SQL.

É recomendável conhecimento prévio sobre .NET e SQL que permitirá criar consultas que poderão ser lidas e escritas facilmente. Aprenderemos, ainda, sobre manipulação de coleções e memória acessando listas do C# e, além de abrir um arquivo .xml, faremos também consultas de dados nos mesmos! Tudo isso de maneira prática e inteligente.

Caso o aluno já tenha assistido ao curso Entity Framework: Persistindo dados em .NET sem dores, o curso LINQ: Crie queries poderosas em C# será uma ótima maneira de explorar o conhecimento adquirido!

Linq to Objects - 1- Introdução ao Linq com select from e where

Para iniciar este curso, primeiro vamos abrir o Microsoft Visual Studio. Criaremos nele um novo projeto em "File > New > Project". O tipo do projeto será ConsoleApplication e nele colocaremos o nome "AluraTunes" clicando em "Ok". Desta maneira, teremos o projeto criado:

O primeiro pedido do cliente foi: listar todos os gêneros que possuem a palavra rock.

Para começar a criar essa consulta é preciso de uma classe que represente gênero, por isso, adicionamos o class Genero que deve conter id e nome. Portanto, vinculado a class Genero colocamos uma propriedade Id, a public int Id { get; set; }, e outra propriedade para Nome, a public string Nome { get; set; }:

class Genero 
{
    public int Id { get; set; }
    public string Nome { get; set; }
}

Vamos acrescentar uma lista contendo diferentes gêneros. Adicionamos a variável var generos = new List<Genero> e dentro dela para cada estilo adicionamos umnew Genero, o Id conforme a posição do estilo e Nome conforme o estilo. Por exemplo, `new Genero { Id = 1, Nome = "Rock"} :

class Program 
{
    static void Main(string[] args)
    {
        //listar os gêneros rock
        var generos = new List<Genero>
        {
            new Genero { Id = 1, Nome = "Rock"},
            new Genero { Id = 2, Nome =  "Reggae"},
            new Genero { Id = 3, Nome =  "Rock Progressivo"},
            new Genero { Id = 4, Nome =  "Punk"},
            new Genero { Id = 5, Nome =  "Clássica"}
        });


    }
}

Agora, vamos imprimir os gêneros no Console e para isso utilizamos um laço. Portanto, logo abaixo do último elemento da lista de gêneros, nós adicionaremos o foreach (var genero In genero) e Console.WriteLine(genero.Id, genero.Nome). No Console.WriteLine, o primeiro parâmetro deve ser uma String composta por {0}, {1} e \t que serve para tabulação entre um dado e outro. Teremos:

foreach (var genero in generos)
{
Console.WriteLine("{0}\t{1}", genero.Id, genero.Nome);
}

Ao rodarmos o código, a lista aparecerá e sumirá logo em seguida! Isso ocorre pois falta uma instrução de que o Console deve aguardar uma interação do usuário. Portanto, adicionaremos o Console.ReadKey() abaixo do WriteLine:

foreach (var genero in generos)
{
Console.WriteLine("{0}\t{1}", genero.Id, genero.Nome);
}
Console.ReadKey();

Ao acrescentar isso a lista mostrará no Console todos os gêneros:

O que faremos é criar um filtro para trazer apenas o gênero rock. Portanto, adicionaremos a condição usando o if() acompanhado de (genero.Nome.Contains("Rock")):

foreach (var genero in generos)
{
    if (genero.Nome.Contains("Rock"))
    {
    Console.WriteLine("{0}\t{1}", genero.Id, genero.Nome);
    }
}

Logo, ao rodar esse código temos:

Será que poderíamos fazer a mesma consulta, mas de uma maneira diferente? Vamos testar uma outra forma que será mais parecida ao que fazemos no SQL!

Felizmente a Microsoft criou um tipo de componente que nos auxilia a fazer esse tipo de consulta, o select * from. Junto disso, adicionaremos o C# que também possui uma sintaxe própria, portanto, a consulta deve iniciar por from . Depois, vamos inserir a variável g. Teremos from g in generos e abaixo disso select g:

from generos in generos
select g;

Falta colocar uma variável que armazene a definição de consulta! Assim, vamos escrever var query = from g in generos:

var query = from g in generos
select g;

Agora que a definição de consulta está pronta, vamos listar os dados! Para isto, utilizaremos o laço foreach() e especificaremos que para cada gênero dentro da consulta deve ser impressa informações, portanto, basta copiar a linha do Console.WriteLine:

var query = from g in generos
select g;

foreach (var genero in query);
{
    Console.WriteLine("{0}\t{1}", genero.Id, genero.Nome);
}

Ao rodar a consulta temos:

Agora falta inserir um espaço entre uma listagem e outra, assim, podemos adicionar Console.WriteLine():

var query = from g in generos
select g;

Console.WriteLine();

foreach (var genero in query);

Rodando isso temos:

Agora temos uma listagem que utiliza o método antigo e outro, o novo! Mas, ainda falta um filtro para a segunda consulta, portanto, vamos adicioná-lo! A única diferença em relação a uma consulta no SQL é o Contains, assim, escrevemos where g.Nome.Contains() e dentro disso, passamos aquilo que deve ser filtrado: o Rock:

// select * from generos

var query = from g in generos
            where g.Nome.Contains("Rock")
            select g;

Console.WriteLine();
foreach (var genero in query)

Rodando isso temos o seguinte:

Finalmente, ambas as consultas possuem o mesmo resultado!

A consulta na qual utilizamos uma sintaxe similar a SQL só é possível devido a um componente que a Microsoft criou que é o LINQ - Language Integrated Query ou Consulta Integrada a Linguagem e essa linguagem é a .NET, C# ou Visual Basic. O LINQ é muito interessante, pois podemos utilizá-lo com base no conhecimento em consultas SQL e aplicá-lo em uma linguagem .NET.

Imagine se tivéssemos diversas condicionais, não só o if que filtra a palavra Rock, mas inúmeros ifs dentro de diversos foreach. Nesse caso a consulta se tornaria extremamente complexa! Seria difícil entender o objetivo da consulta! Utilizando o LINQ e, baseado na vivência SQL, já é possível compreender melhor a intenção do código!

Linq to Objects - 2 - Linq com joins

Nesta aula, vamos começar a criar consultas que combinam dados de origens diferentes! Por enquanto não existe uma classe que armazene as músicas, por isso, é preciso criá-la. Adicionamos class Musica e dentro disso acrescentamos Id:

public int Id { get; set; }

Além disso, também:

public string Nome { get; set; }

Ainda dentro da classe Musica, é preciso inserir a informação sobre gênero, portanto, acrescentamos public int GeneroId { get; set; } e teremos:

class Musica 
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public int GeneroId { get; set; }
}

Para cadastrar as músicas, criamos uma variável que deve conter uma lista de músicas, a var musicas = new List<Music>. A lista estará vazia inicialmente, então, começaremos a cadastrar as músicas. Colocaremos esse código logo abaixo do Console.WriteLine("{0}t{1}", genero.Id, genero.home). Teremos:

//listar músicas

var musicas = new List<Musica>
{
    new Musica { Id = 1, Nome = "Sweet Child O'Mine", GeneroId = 1 },
    new Musica { Id = 2, Nome = "I Shoot The Sheriff", GeneroId = 2},
    new Musica { Id = 3, Nome = "Danúbio Azul", GeneroId = 5},
}

Com isso a lista de músicas será cadastrada!

Agora, vamos criar uma consulta que pegue os dados da lista e para isso utilizaremos a linguagem LINQ que já aprendemos a manusear:

var musicaQuery = from m in musicas
                  select m;

É preciso também imprimir as músicas, assim, usaremos o foreach(var musica in musicaQuery) e o Console.WriteLine(). Dentro deste último, colocaremos o formato e musica.Id, musica.Nome, musica.GeneroId e os indíces"{0}\t{1}\t{2}". Teremos:

var musicaQuery = from m in musicas
                  select m;

foreach(var musica in musicaQuery)
{
    Console.WriteLine(`"{0}\t{1}\t{2}", musica.Id, musica.Nome, musica.GeneroId);
}

Acrescentar uma linha entre as duas listagens para diferenciá-las! E adicionamos mais um Console.WriteLine()

var musicaQuery = from m in musicas
                  select m;


console.WriteLine();
foreach(var musica in musicaQuery)
{
    Console.WriteLine("{0}\t{1}\t{2}", musica.Id, musica.Nome, musica.GeneroId);
}

E rodando isto temos o seguinte:

Entretanto, note que a listagem ainda não está bacana, pois o Id do gênero segue sem informar nada! Por isso, vamos modificar a consulta para incluir também a listagem de gêneros!

O problema é: Como é possível fazer uma consulta que junte duas entidades diferentes?

Para resolver esta situação basta utilizar uma claúsula inner join e para isso é preciso relacionar duas tabelas. Em nosso caso, no código C#, não existem duas tabelas, portanto, é preciso trabalhar com objetos do sistema. Dessa maneira, nós vamos fazer um join utilizando a listagem de música. Assim, escrevemos join g in genero e utilizando o on, colocaremos as duas propriedades que se relacionam. No caso, o objeto de tipo gênero e o objeto de tipo música. Adicionaríamos m.GeneroId == g.Id se a sintaxe do join permitisse o == , no entanto, somos obrigados a substituir por equals:

var musicQuery = from m in musicas
                 join g in genero on m.GeneroId equals g.Id
                 select m;

Rodando a consulta temos:

Mas, repare que isso não muda absolutamente nada na aplicação! Não basta trazer apenas o m é preciso também pegar o g. Para fazer isso vamos utilizar um objeto anônimo. Trata-se do objeto que não possui nome e já está pronto para ser aplicado. Por isso, iremos escrever select new {} e passaremos as propriedades m e g:

var musicQuery = from m in musicas
                 join g in genero on m.GeneroId equals g.Id
                 select new { m, g};

Porém, na linha do Console.WriteLine será acusado um erro na sintaxe. Isso ocorre, pois não existe mais o musica.ID, musica.Nome e musica.genero Id, o que temos é um objeto com propriedade m e g. Assim, não é preciso acessar essas propriedades diretamente, portanto, basta escrever musica.m.Id, musica.m.Nome e musica.m.GeneroId:

foreach(var musica in musicaQuery)
{
    Console.WriteLine("{0}\t{1}\t{2}", musica.m.Id, musica.m.Nome, musica.m.GeneroId);
}

E, rodando a aplicação teremos:

Ou seja, nada de novo ocorre! Falta inserir o nome do gênero. Assim, modificaremos musica.m.GeneroId por musica.g.Nome que equivale ao nome do gênero:

foreach(var musica in musicaQuery)
{
    Console.WriteLine("{0}\t{1}\t{2}", musica.m.Id, musica.m.Nome, musica.g.Nome);
}

E ao rodar novamente teremos:

Assim, conseguimos finalizar a primeira consulta utilizando como recurso o LINQ!

Imagina se fizéssemos a mesma consulta, mas utilizando laços? Seria bem mais complicado!

Sobre o curso Entity LinQ parte 1: Crie queries poderosas em C#

O curso Entity LinQ parte 1: Crie queries poderosas em C# possui 190 minutos de vídeos, em um total de 61 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

  • 1124 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1124 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1124 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1124 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana