IEnumerable e GroupBy

image

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou falar como eu utilizei o GroupBy e o Sum isso porque eu preciso dos valores agrupados e depois sumados de acordo com cada linha. Basicamente esse é o problema que estou tendo e preciso resolver para montar um gráfico as ferramentas abaixo:

  • Linguagem: C# (sharp)
  • Ferramenta: Visual Studio
  • Plataforma: Web Razor
  • Framework: .NetCore
  • Database: SQLServer e EntityFramewok

Como eu utilizei o EntityFramework da Microsoft para consultar dados no banco de dados, o método que consulta os dados retorna pra mim o tipo IEnumerable<CustomClass>, veja o código 1.1 que mostra mais sobre o método.

Código 1.1 - Pega todos os doadores

public IEnumerable<Donors> GetAllToDonors()
{
    var result = (from d in _db.Set<Donors>()
            join u in _db.Set<DonorsUser>()
                on d.UserDonorsId equals u.UserDonorsId
            select new Donors
            {
                Name = u.NameDonors,
                Date = d.Date,
                DonorsId = d.DonorsId,
                Email = u.EmailDonors,
                Money = d.Money,
                Notes = d.Notes,
                Quantity = d.Quantity,
                Type = d.Type,
                UserDonorsId = d.UserDonorsId,
                UserId = d.UserId,
                Year = d.Year
            })
        .OrderBy(x => x.Name)
        .ThenByDescending(x => x.Year);

    return result;
}

Note que não existe nenhum parâmetro de entrada no método e ele retorna um IEnumerable<Donors>. Aqui eu fiz um SELECT com INNER JOIN usando (from e join), no final usei o OrderBy(x => x.Name) e ThenByDescending(x => x.Year).

Depois que retorno os dados é necessário agrupar os dados por ano. O código 1.2 mostra.

Código 1.2 - GroupBy

//call the method
var DonorsEnumerable = _service.GetAllToSum();

//groupby
var Years = DonorsEnumerable.GroupBy(x => x.Year);

Depois de acessar o serviço e pegar todos os dados, precisei fazer um GroupBy pelo ano com o lambida (x => x.Year). Dessa forma eu tenho todos os dados agrupados pelos anos. Agrupado por ano, agora eu preciso somar todos os valores em cada linha agrupada. Para isso é necessário fazer um for e pra cada linha fazer a soma de valores. Com esses dados, consigo gerar o gráfico necessário dentro da aplicação web.

Para somar os valores que eu preciso, precisei utilizar o código 1.3.

Código 1.3 - Somando valores

for (int i = 0; i < Years.Count(); i++){
	var valor = Years.ToList<IGrouping<string, GiftWeb.Model.DonorsAndUsersReturned>>()[i].Sum(x => x.Money);
	
	//save valores to create a report
}

Dentro do ToList<...> eu peguei o index[i].Sum e coloquei o lambida para somar apenas o campo Money. Com os dados somados em mãos, agora eu posso gerar um gráfico da maneira que eu quiser agrupado por ano. A figura 1.1 mostra como ficou o gráfico. Eu não vou mostrar aqui como eu gerei o gráfico por que não é o propósito do artigo, eu posso falar como fazer em outro artigo se você quiser.

Figura 1.1 - Gráfico final.

Image

Espero que tenha gostado e qualquer dúvida por entrar em contato comigo Mauricio Junior pelo meu site pessoal. Abraços e até a próxima.

  • Mauricio Junior

    Mauricio Junior