none
Ajuda com LINQ RRS feed

  • Pergunta

  • Olá pessoal...Estou precisando de uma ajuda com LINQ....C#
    
    
       
     public class Carrinho
        {
           public int IdCarrinho{ get; set; }
    
           public decimal ValorTotal
            {
                get
                {
                    return Itens.Sum(x => x.Subtotal);
                }
            }
    
            public List<ItemCarrinho> Itens { get; set; }
    
            public Carrinho()
            {
                Itens = new List<ItemCarrinho>();
                DataInicio = DateTime.Now;
            }
        }
    
    
        public class ItemCarrinho
        {
            public string Produto { get; set;}
            public int ProdutoQuantidade { get; set; }
    
            public int PromoQuantId { get; set; }
          
            public decimal Subtotal { get; set; }
         
            }
        }
    	Todos os itens que tem PromoQuantId = 1  e cada soma de 3 de ProdutoQuantidade devem ter o preço de 5,00 cada...senão 10,00
    
    	Exemplo: 
    	Itens:
    	PromoQuantId   Produto        ProdutoQuantidade     Preco
              1            Produto01            1               5,00    (aplicou desconto pq este mais 2 abaixo formam 3 e entram na promoção...)
              1            Produto02            2               10,00   (o primeiro item de cima + 2 deste formando 3 a quantidade de PromoQuantId=1
              1            Produto03            1               10,00   (apenas 1 item não entra na promocao (necessario 3 itens) entao preço = 10,00
              0            Produto04            2               20,00   (PromoQuantId = 0 não entra na promocao...preco de cada item=10,00)
    
    Alguém saberia como posso ter este funcionamento? Valeu....






    quarta-feira, 20 de janeiro de 2021 22:39

Respostas

  • Estudei um pouco o LINQ e resolvi assim:

            private void AplicaPromoQuantidade()
            {
                foreach (int xid in _promosQuantidadeIds)
                {
                    _qtd = Global.gCarrinho.Itens.Where(x => x.PromoQuantId == xid).Sum(z => z.ProdutoQuantidade);
                    if(_qtd>0)
                    {      
                        Global.gCarrinho.Itens.Where(x => x.PromoQuantId == xid).ToList().ForEach(z => AplicaPromoQuantItem(z));
                    }
                }
            }
    
            private ItemCarrinho AplicaPromoQuantItem(ItemCarrinho item)
            {
                int i = (item.ProdutoQuantidade % item.PromoQuantQuantidade);             
                    if ((_qtd % item.PromoQuantQuantidade) == 0)
                    { 
                        item.Subtotal = item.PrecoPromoQuantidade * item.ProdutoQuantidade;
                    } else
                    {
                        item.Subtotal = item.PrecoPromoQuantidade * (item.ProdutoQuantidade - i) + (item.CarrinhoProduto.PrecoVenda * i);
                    }      
                return item;
            }
        




    quarta-feira, 27 de janeiro de 2021 14:35

Todas as Respostas

  • Olá, Samuel!

    Basta aplicar esse código no subtotal e depois listar os itens, já funciona!

       
     public decimal Subtotal
            {
                get 
                {
                    decimal valorPromocional = 5;
                    decimal valorNormal = 10;
                    if (PromoQuantId == 1)
                        return valorPromocional * ProdutoQuantidade;
                    else
                        return valorNormal * ProdutoQuantidade;
                }
                
            }
    

    sexta-feira, 22 de janeiro de 2021 03:23
  • Olá, Jussi....Essa seria a solução para quantidade do mesmo item....acontece que esse sistema deve considerar a quantidade pra itens diferentes mas que façam parte da promoção....Acredito que deva ser utilizado LINQ em "Itens" na classe "Carrinho"....Na pergunta eu coloquei que o codigo deveria ser inserido naquele local...mas acredito que seja na classe "Carrinho" pois precisa considerar cada "ItemCarrinho".

    Repare "3 itens por 15,00" (5,00 cada um) sendo que o preço normal seria 10,00 mas esses itens poderiam ser de produtos diferentes...

    sexta-feira, 22 de janeiro de 2021 12:19
  • Entendi! 

           decimal valorComum = 10;
                decimal valorPromocional = 5;
    
                carrinho.Itens.ForEach(l => l.Subtotal = valorComum * l.ProdutoQuantidade);
                var ItensPromocionaisNoCarrinho = carrinho.Itens.Where(l => l.PromoQuantId == 1).ToList();
    
                List<ItemCarrinho> ListaFinal = new List<ItemCarrinho>();
                ListaFinal.AddRange(carrinho.Itens.Where(l => l.PromoQuantId != 1).ToList());
    
                int index = 0;
                List<ItemCarrinho> itensPromocionaisAdicionados = new List<ItemCarrinho>();
                foreach (var item in ItensPromocionaisNoCarrinho)
                {
                    item.Subtotal = valorPromocional * item.ProdutoQuantidade;
                    itensPromocionaisAdicionados.Add(item);
                    index++;
    
                    if(index == 3)
                    {
                        ListaFinal.AddRange(itensPromocionaisAdicionados);
                        index = 0;
                        itensPromocionaisAdicionados.Clear();
                    }
                }
    
                itensPromocionaisAdicionados.ForEach(l => l.Subtotal = valorComum * l.ProdutoQuantidade);
                ListaFinal.AddRange(itensPromocionaisAdicionados);

    Põe esse código antes de fazer a listagem mesmo, depois vc exibe a "ListaFinal" ou substitui os itens do carrinho > carrinho.Itens = ListaFinal

    • Editado Jussi Dev sábado, 23 de janeiro de 2021 01:39
    sábado, 23 de janeiro de 2021 01:35
  • Estudei um pouco o LINQ e resolvi assim:

            private void AplicaPromoQuantidade()
            {
                foreach (int xid in _promosQuantidadeIds)
                {
                    _qtd = Global.gCarrinho.Itens.Where(x => x.PromoQuantId == xid).Sum(z => z.ProdutoQuantidade);
                    if(_qtd>0)
                    {      
                        Global.gCarrinho.Itens.Where(x => x.PromoQuantId == xid).ToList().ForEach(z => AplicaPromoQuantItem(z));
                    }
                }
            }
    
            private ItemCarrinho AplicaPromoQuantItem(ItemCarrinho item)
            {
                int i = (item.ProdutoQuantidade % item.PromoQuantQuantidade);             
                    if ((_qtd % item.PromoQuantQuantidade) == 0)
                    { 
                        item.Subtotal = item.PrecoPromoQuantidade * item.ProdutoQuantidade;
                    } else
                    {
                        item.Subtotal = item.PrecoPromoQuantidade * (item.ProdutoQuantidade - i) + (item.CarrinhoProduto.PrecoVenda * i);
                    }      
                return item;
            }
        




    quarta-feira, 27 de janeiro de 2021 14:35
  • Oi Samuel, fico feliz que tenha resolvido por si só! :D

    E essa separação das atribuições em métodos, é uma boa prática de programação, continue assim. 

    sexta-feira, 29 de janeiro de 2021 12:09
  • Obrigado pela ajuda e tempo utilizado para responder...
    sexta-feira, 29 de janeiro de 2021 20:41