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.
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.