Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Update em multiplas tabelas

Bom dia, suponha que eu tenha uma tabela pedido e essa tabela tem um campo situação que eu preciso alterar essa situação, eu tenho buscar o registro e guardar numa variável do tipo pedido, alterar a informação que eu quero e depois salvar certo? Por debaixo dos panos o processo é um select pra buscar o registro e depois um update pra alterar o registro, em questão de desempenho, se eu rodasse o update direto com o comando SQL nao seria mais rápido do que rodar um select + update? ou a diferença de desempenho é mínima que nem seria percebido?

3 respostas

Rafael, gostaria de ver um exemplo desse código para ter uma idéia melhor do que sugerir em termos de performance. Para essa resposta estou considerando estamos discutindo uma aplicação Web, ok?

Supondo que os 2 comandos SQL sejam feitos numa mesma requisição Http, de fato buscar o registro e depois fazer um update faz com que dois acessos ao banco sejam realizados, o que impactaria a performance mais do que apenas um comando.

Contudo, geralmente em aplicações Web o SELECT é feito em uma requisição diferente da que emite o UPDATE, o que torna o impacto de performance imperceptível, como você mesmo escreveu.

De qualquer maneira, as últimas versões do EF Core estão buscando otimizar cada vez mais os SQL gerados automaticamente, de modo que não precisemos mais nos preocupar tanto com performance.

Espero que tenha ajudado em sua dúvida.

Abraços, Daniel

O problema é que eu passo string como parametros pro controller e não o model, eu estou na tela de carrinho e quando vou finalizar a compra eu passo no post a id do pedido, e ai no controller eu busco o pedido pela id e depois dou o update. Faço a mesma coisa pra inserir o item no carrinho passo o código do produto e a quantidade, depois eu busco a ID do pedido na tebela de pedido e ai insiro o item na tebela pedido_itens. Eu tentei fazer sozinho sem consultar as aulas pra ver o que eu me lembrava, agora vou refatorar tudo seguindo as aulas por que to achando que o código ta bem ruim.

    [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult AddCarrinho(string codigoProduto, int quantidade)
        {
            HttpCookie cart = Request.Cookies.Get("Cart");
            HttpCookie cartQtd = Request.Cookies.Get("CartQtd");

            if(cart != null)
            {
                _pedidoItensDAO.InsereItem(_pedidoDAO.RetornaPedido(cart.Value), codigoProduto, quantidade);
                cartQtd.Value = (Convert.ToInt32(cartQtd.Value) + quantidade).ToString();
                Response.Cookies.Add(cartQtd);
            }
            else
            {
                var token = Guid.NewGuid().ToString();
                _pedidoDAO.InserePedido(token);
                _pedidoItensDAO.InsereItem(_pedidoDAO.RetornaPedido(token), codigoProduto, quantidade);
                Response.Cookies.Add(new HttpCookie("Cart", token));
                Response.Cookies.Add(new HttpCookie("CartQtd", quantidade.ToString()));
            }

            return Json(string.Empty);
        }
solução!

Rafael, no seu código acima é o método RetornaPedido() que está fazendo o SELECT pra retornar o id do pedido que foi incluído via INSERT no método InsereItem()?

Não sei se já conhece esse comportamento, mas o EF Core retorna o identificador do registro que acabei de ser incluído. Ou seja, seu eu fizer:

var pedido = new Pedido();
//atribuição de valores para as propriedades aqui
//pedido.Id não estará preenchido

contexto.Pedidos.Add(pedido);

Console.WriteLine(pedido.Id); 
//agora pedido.Id estará preenchido com o valor atribuído pelo EF

Daí você pode usar esse identificador como retorno do método InsereItem(), evitando fazer um SELECT pra buscar novamente o pedido.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software