Inquiridor
Insert ou update baseado em consulta linq to sql

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
Todas as Respostas
-
-
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 !
-
-
-
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 !