C# - Como funciona o agrupamento com Group by da LINQ
No artigo de hoje veremos como funciona o agrupamento de dados usando a cláusula Group da LINQ. |
O agrupamento de dados feito via SQL é diferente do agrupamento realizado usando
consultas LINQ com a cláusula Group.
O agrupamento é um dos recursos mais poderosos do LINQ, e, podemos agrupar dados da seguintes formas:
Por uma única propriedade.
Pela primeira letra de uma propriedade de cadeia de caracteres.
Por um intervalo numérico calculado.
Por predicado booliano ou outra expressão.
Por uma chave composta.
Na LINQ, a cláusula group funciona da seguinte maneira:
Assim, no grupamento feito pelo group by da LINQ podemos obter os elementos individuais, visto que é criado uma sequência de grupos e esses grupos implementam IGrouping<Tkey,T) no qual TKey é o atributo usado para fazer o agrupamento e T representa a entidade original.
Vejamos isso funcionando na prática em um projeto do tipo Console criado no VS 2017 Community.
recursos usados:
Visual Studio 2017 Community
Criando o projeto e usando Group by da LINQ
Vamos iniciar com um exemplo onde vamos usar a sintaxe de consulta - Query Sintax - em um projeto Console chamado CShp_LINQ_Group;
Vamos criar uma classe Aluno no projeto com o código abaixo:
public class Aluno
{
public int AlunoId { get; set; }
public string Nome { get; set; }
public char Sexo { get; set; }
public string Curso { get; set; }
}
|
A seguir na classe Program inclua o código abaixo:
using System.Collections.Generic;
using System.Linq;
using static System.Console;
namespace CShp_LINQ_Group
{
class Program
{
private static IList<Aluno> listaAlunos = GetAlunos();
static List<Aluno> GetAlunos()
{
List<Aluno> alunos = new List<Aluno>() {
new Aluno() { AlunoId = 1, Curso = "Fisica", Nome = "Vitor", Sexo ='M' },
new Aluno() { AlunoId = 2, Curso = "Quimica", Nome = "Jorge", Sexo ='M' },
new Aluno() { AlunoId = 3, Curso = "Engenharia", Nome = "Bernardo", Sexo ='M' },
new Aluno() { AlunoId = 4, Curso = "Moda", Nome = "Danusa", Sexo ='F' },
new Aluno() { AlunoId = 5, Curso = "Moda", Nome = "Carla", Sexo ='F' },
new Aluno() { AlunoId = 6, Curso = "Fisica", Nome = "Helio", Sexo ='M' },
new Aluno() { AlunoId = 7, Curso = "Engenharia", Nome = "Bianca", Sexo ='F' },
new Aluno() { AlunoId = 8, Curso = "Quimica", Nome = "Vilma", Sexo ='F' },
new Aluno() { AlunoId = 9, Curso = "Engenharia", Nome = "Amanda", Sexo ='F' },
};
return alunos;
}
static void Main(string[] args)
{
var listaAgrupada = from aluno in listaAlunos
group aluno by aluno.Curso into cursoGrupo
orderby cursoGrupo.Key ascending
select cursoGrupo;
foreach (var grupo in listaAgrupada)
{
WriteLine(string.Format($"Curso : {grupo.Key}"));
foreach (var aluno in grupo)
{
WriteLine($"\t {aluno.Nome} - {aluno.Sexo}");
}
}
Read();
}
}
}
|
Note que na consulta estamos usando a palavra chave into que se comporta como uma variável de intervalo.
É como se tivéssemos uma segunda consulta após a palavra-chave into. Aqui estamos solicitando os dados obtidos na primeira parte, e a seguir, inserindo em cursoGrupo pela chave(Key) que é Curso.
Executando o projeto iremos obter :
Agrupando usando uma chave composta
Vamos agora realizar um novo agrupamento desta vez usando uma chave composta. Vamos agrupar os alunos pelo Curso e pelo sexo do aluno.
Usamos uma chave composta para agrupar elementos de acordo com mais de uma chave. Uma chave composta é criada usando um tipo anônimo ou nomeado para armazenar o elemento-chave.
Nosso código ficaria assim:
private static void AgruparPorCursoLetraNome()
{
var listaAgrupada = from aluno in listaAlunos
group aluno by new
{
aluno.Curso,
aluno.Sexo
};
foreach (var grupo in listaAgrupada)
{
WriteLine(string.Format("Curso : {0}", grupo.Key.Curso, grupo.Key.Sexo));
foreach (var aluno in grupo)
{
WriteLine($"\t {aluno.Nome} - {aluno.Sexo}");
}
}
}
|
Executando o projeto iremos obter:
Neste exemplo a cláusula group faz com que um grupo separado seja criado para cada conjunto de alunos com o mesmo curso e o mesmo sexo.
Pegue o código do projeto aqui:
CShp_LINQ_Group.txt
Salmos 25:5
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
LINQ to Objects - Realizando Consulta em Coleções de ... - Macoratti
LINQ - Consultas com estilo Fluent e Query Expression - II - Macoratti
LINQ - Revisando conceitos básicos - Macoratti
LINQ Operadores - Macoratti
LINQ - Realizando consultas de referência cruzada com ... - Macoratti