none
Insert ou update baseado em consulta linq to sql RRS feed

  • Pergunta

  • Bom dia pessoal.

    Tenho uma tabela com detalhes de um pedido, nela eu preencho com informações que pego de cada linha de um gridview com produtos e um templatefield com a qtde de produtos. Agora o desafio é: eu faço uma consulta da tabela produtos via linq to sql. e uso if's para saber se o produto ja esta na tabela detalhesPedido. se estiver, apenas preencho a quantidade, caso contrario, entra como insert de novo item. O evento é no OnClick onde percorro cada linha do GridView com os produtos e caso seja diferente de zero, ele é convidado a ir para a tabela DetalhesPedido. Segue o codigo:

    foreach (GridViewRow row in GridView1.Rows)
                {
                    //Pegando os produtos
    
                    Label lblProdutoID = row.FindControl("lblProdutoID") as Label;
                    var preco = (from p in db.Produtos
                                 where p.ProdutoID == Convert.ToInt32(lblProdutoID.Text)
                                 select p.Preco).SingleOrDefault();
    
                    var produto = (from p in db.Produtos
                                 where p.ProdutoID == Convert.ToInt32(lblProdutoID.Text)
                                 select p).SingleOrDefault();
    
                    int dropDownListText = Convert.ToInt32(((DropDownList)row.FindControl("ddlQtde")).SelectedItem.Value);
    
    
    
                        if ((dropDownListText != 0))
                        {
    
                            //Aqui eu pego a tabela de produtos
                            var nte = (from p in db.DetalhesPedidos
                                       where p.PedidoID == Convert.ToInt32(Session["pedido"])
                                       where p.ProdutoID == Convert.ToInt32(lblProdutoID.Text)
                                       select p).SingleOrDefault();
    
                            
    
    //se não tiver produto, inserta
                            if (nte == null)
                            {
                                DetalhesPedido dp = new DetalhesPedido
                                {
                                    UsuarioID = usurioid,
                                    PedidoID = novopedido.PedidoID,
                                    ProdutoID = produto.ProdutoID,
                                    Qtde = Convert.ToInt32(dropDownListText),
                                    Preco = Convert.ToDecimal(produto.Preco),
                                    Total = Convert.ToDecimal(produto.Preco * Convert.ToDecimal(dropDownListText)),
    
                                };
                                db.DetalhesPedidos.InsertOnSubmit(dp);
                                db.SubmitChanges();
                            }
    //caso contrario, atualiza
                            else if (nte.ProdutoID == produto.ProdutoID)
                            {
                                nte.Qtde += dropDownListText;
                                nte.Total = produto.Preco * nte.Qtde;
                                db.SubmitChanges();
                            }
    
                           
                        }
     
                }

    Não sei se essa é a melhor pratica, gostaria da ajuda e informações.

    Grato pela ajuda pessoal

    quinta-feira, 23 de outubro de 2014 18:08

Todas as Respostas

  • Olá Cláudio,

    Me parece uma boa implementação. Não conheço exatamente seu requisito de negócio mas, da forma que implementou não vi nenhum problema em potencial para lhe sugerir alguma mudança.

    quinta-feira, 23 de outubro de 2014 18:15
  • Olá Claudio,

     a melhor prática seria gravar todas as linhas de seu DataGrid em um List<T>, e depois fazer a consulta de uma vez, e ir trabalhando somente na memória assim só iria fazer o "Commit" quando inserir todos os itens assim faria o db.SubmitChanges()...

     Não sei o seu nível de conhecimento em linq, mas iria ganhar muito em performance, pois não seria um select para cada linha, seria somente um select para todas as linhas para codificar fica mais complicado mas ganha em performance, isso tudo implica em tempo de desenvolvimento e tamanho de banco se for algo pequeno não vejo problemas, mas a cada linha vai ser feito varios selects e envolve a rede também... Basta você avaliar e verificar se a mudança não implica em seu projeto !

    quinta-feira, 23 de outubro de 2014 18:27
  • Obrigado pelo reply Deric, o caso é que ele o primeiro iF ele implementa perfeito. O meu dilema é ele percorrer o banco para saber se ja existe o item, caso exista, ele apenas atualiza, pelo menos, deveria atualizar, mas nao ocorre.
    quinta-feira, 23 de outubro de 2014 18:38
  • Sim Daniel, entao a melhor coisa entao seria usar datatable?
    quinta-feira, 23 de outubro de 2014 18:59
  • Sim Daniel, entao a melhor coisa entao seria usar datatable?

     Não !

     como eu disse, dessa forma somente vai demorar um pouco mais pela quantidade de Selects, pois a cada iteração é realizado um Select, isso poderia ser feito apenas uma vez entende !

     

    sexta-feira, 24 de outubro de 2014 18:39