LINQ – Language Integrated Query

Recentemente recebi a 2ª edição do livro “Como programar com ASP.NET e C#” do autor Alfredo Lotar enviado como cortesia pela Editora Novatec para fazer uma resenha sobre ele. Como já conheço a qualidade do trabalho do Alfredo Lotar então dei inicio ao estudo sobre LINQ que era o meu maior interesse até então.

Mais o que vem a ser o LINQ? Language Integrated Query ou simplesmente LINQ consistem em um modelo de programação unificado para extrair e atualizar dados de diferentes fontes de dados utilizando uma sintaxe conhecida como por exemplo o C# (C-Sharp).

Com o LINQ podemos por exemplo manipular um array com uma sintaxe bem simples. Então vamos a um pequeno exemplo.


int[] num = { 1, 8, 3, 6, 5, 0, 4, 7, 2, 9 };

var obj = from n in num 
            where n > 5 
            select n;

GridView1.DataSource = obj;
GridView1.DataBind();

Como por ver no exemplo anterior, criar um array de inteiros (int ou integer) com numero. Utilizando instrução LINQ realizei uma consulta e retornando os numeros maiores que 5. E o resultado irá retornar os numeros 8, 6, 7 e 9.

Agora vamos a mais alguns exemplos:

Ordenando dados usando ORDERBY

var obj = from n in num 
            where n > 5 
            orderby n
            select n;

Organizando os dados em ordem ascendente usando ORDERBY e ASCENDING

var obj = from n in num 
            where n > 5 
            orderby n ascending
            select n;

Organizando os dados em ordem descendente usando ORDERBY e DESCENDING

var obj = from n in num 
            where n > 5 
            orderby n descending
            select n;

Faremos em seguinda um pouco diferente. Dessa vez teremos um array de string.


string[] nomes = { "Joao", "Maria", "Paulo", "Rita", "Vitor", "Suzana", "Denis", "Ana", "Jose", "Beatriz", "Marcia" };

var obj = from n in nomes 
          where n.Length > 4 
          select n;

GridView1.DataSource = obj;
GridView1.DataBind();

Você viu no exemplo anterior uma lista de nomes na qual eu realizei uma consulta solicitando que fosse retornado os nomes que tivessem mais de 4 caracteres.

Agora vamos complicar um pouco as coisas. Vamos criar uma estrutura chamado Cliente as propriedades Codigo e Nome e nela implementaremos a Interface IComparable para nos dar a possibilidade de criar uma ordenação de dados usando o LINQ.


public class Cliente : IComparable
{
    public int Codigo { get; set; }
    public string Nome { get; set; }

    public Cliente()
    {
    }

    public Cliente(int Codigo, string Nome)
    {
        this.Codigo = Codigo;
        this.Nome = Nome;
    }
    
    public int CompareTo(object obj)
    {
        Cliente temp = (Cliente)obj;

        if (this.Codigo < temp.Codigo)
        {
            return 1;
        }

        if (this.Codigo > temp.Codigo)
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }
}

Agora usaremos a estrutura criando um array e adicionando dados.


List<Cliente> lstClientes = new List<Cliente>();
lstClientes.Add(new Cliente(3, "Maria"));
lstClientes.Add(new Cliente(5, "Pedro"));
lstClientes.Add(new Cliente(1, "Paulo"));
lstClientes.Add(new Cliente(4, "Rita"));
lstClientes.Add(new Cliente(2, "João"));

Depois de criado nosso array de Cliente com os dados, vamos a nossa consulta usando LINQ.


var obj = from c in lstClientes.ToArray()
          select c;

O exemplo anterior não é diferente dos já citados a não ser por um pequeno detalhe. Se executarmos o código abaixo e apresenta-lo no GridView, será exibido o Codigo e o Nome. Mais podemos limitar isso como por exemplo exibir somente o Nome. Veja o exemplo:


var obj = from c in lstClientes.ToArray()
          select new { c.Nome };

Vamos agora atribuir um filtro a nossa consulta e ordenar.


var obj = from c in lstClientes.ToArray()
          where c.Nome.Contains("P")
          orderby c.Codigo ascending
          select new { c.Codigo, c.Nome };

Na consulta anterior realizamos a busca de nomes iniciados com “P” e ainda ordenamos por Codigo

A vantagens de se usar o LINQ é que temos uma flexibilidade muito grande para realizar consultar o que torna o código mais compacto e mais compreensível. Mais as vantagens não para por ai. Podemos ainda:

Junção de 2 ou mais estruturas com JOIN:


var obj = from p in pessoas
          join c in cidades on p.IdCidade equals c.IdCidade
          join u in ufs on c.IdUf equals u.IdUf
          select new { p.IdPessoa, p.NomePessoa, c.NomeCidade, u.SiglaUf };

Agrupamento com GROUP BY:

var obj = from p in pessoas
          join c in cidades on p.IdCidade equals c.IdCidade
          join u in ufs on c.IdUf equals u.IdUf
          group u by u.IdUf into grupo
          from g in grupo.Distinct<UFs>()
          select new { g.IdUf, g.SiglaUf, TotalPessoas = grupo.Count<UFs>() };

Enfim, existe muito mais opções de uso do LINQ e que com certeza deixará nosso trabalho mais facil e um código mais simples. Lembrando que o uso do LINQ não se limita aos exemplos acima mencionado e que o mesmo pode ser feito a consultas a dados.

Ainda para finalizar, deixo uma dica para você que quer treinar a aprender mais da sintaxe do LINQ e de quebra realizar consulta diretamente a um banco de dados, bastando usar o LINQPAD

Exemplo de uso do LINQ no LINQPAD

Exemplo de uso do LINQ no LINQPAD

Abraço e bom estudo!

“Se um dia você tiver que escolher entre o mundo e o amor, lembre-se: Se escolher o mundo ficará sem amor, mas se você escolher o amor, com ele conquistará o mundo” (Albert Einstein)