public async Task <RankingViewModel> GetRankingClientes(int?ano) { try { //Lista de vendas var vendas = new DataAccess.VendaDataAccess().GetList(); //Filtro var filter = vendas.AsEnumerable().Where(x => (ano == null || x.dtVenda.Year == ano)).ToList(); //Ranking var ranking = from venda in filter group venda by venda.nuCNPJ into vendasGroup select new { cnpj = vendasGroup.Key, qtdeVendas = vendasGroup.Count(), vendas = vendasGroup }; //Ordenação ranking = ranking.OrderByDescending(x => x.qtdeVendas); //Transformo o objeto anônimo em viewmodel var rankingView = new RankingViewModel(); decimal vrTotalVendas = 0; var nmCliente = string.Empty; foreach (var item in ranking) { var vendaModelList = new List <VendaModel>(); foreach (var itemVenda in item.vendas) { var produto = new ProdutoBusiness().Get(itemVenda.idProduto); if (produto != null) { var vrProduto = produto.vrProduto.Split('$')[1]; vrTotalVendas = vrTotalVendas + decimal.Parse(vrProduto); var vendaModel = new VendaModel(itemVenda.nuCNPJ, itemVenda.dtVenda, itemVenda.idProduto, produto.nmProduto, vrProduto); vendaModelList.Add(vendaModel); } } var cliente = await new ClienteBusiness().Get(item.cnpj); nmCliente = cliente.icSucesso ? string.IsNullOrEmpty(cliente.nmCliente) ? cliente.nmFantasia : cliente.nmCliente : "Cliente não localizado"; var vendaViewModel = new VendaViewModel(); vendaViewModel.Vendas = vendaModelList; var itemRank = new RankingModel(item.qtdeVendas, vrTotalVendas, nmCliente, vendaViewModel); rankingView.Ranking.Add(itemRank); vrTotalVendas = 0; } return(rankingView); } catch (Exception e) { return(new RankingViewModel(e.Message)); } }