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>() };
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
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)