2
respostas

06. Relacionamento Many to Many e Include . Vídeo 02

Hello!

Alguém poderia me explicar o include e theninclude desse código aqui?

Venda v = contexto.Vendas .Include(vp => vp.ProdutoVenda) .ThenInclude(pv => pv.Produto) .FirstOrDefault(v2 => v2.ID == 1);

Eu não entendi muito bem pra que serve. Assim,. não entendi bem a explicação.

Obrigada.

2 respostas

Olá Rafaela,

Se você tentar filtrar uma venda apenas chamando o FirstOrDefault, assim:

Venda venda = contexto.Vendas.FirstOrDefault(v2 => v2.ID == 1);

mesmo que você tenha o atributo IList<ProdutoVenda> ProdutoVenda na Venda , ele não virá preenchido no objeto Venda retornado. Você precisa dar o comando Include(v => v.ProdutoVenda) para dizer ao Entity Framework que quando ele filtrar a Venda, tem que trazer junto a sua lista de ProdutoVenda.

Venda venda = contexto.Vendas
                        .Include(v => v.ProdutoVenda)
                        .FirstOrDefault(v2 => v2.ID == 1);

Agora sim conseguimos fazer um foreach por exemplo dentro dessa lista dado que ela vem preenchida.

foreach(ProdutoVenda pv in venda.ProdutoVenda) {
    ...
}

Só que agora, se você tentar fazer um foreach por essa lista para pegar o nome de cada Produto do ProdutoVenda

foreach(ProdutoVenda pv in venda.ProdutoVenda) {
    string nome = pv.Produto.Nome;
}

Ele vai dará uma exception na linha pv.Produto.Nome informando que o Produto do pv está null. Ou seja, mesmo incluindo a IList<ProdutoVenda> , cada ProdutoVenda veio sem o seu Produto. Para trazer este item junto com o ProdutoVenda, ai sim usamos o ThenInclude( pv => pv.Produto), dizendo que para cada pv (ou seja, cada ProdutoVenda que será colocado na lista) é para incluir também o seu pv.Produto.

Venda venda = contexto.Vendas
                        .Include(v => v.ProdutoVenda) //traz na Venda a List<ProdutoVenda> preenchida
                        .ThenInclude( pv => pv.Produto) //para cada ProdutoVenda traz também o Produto
                        .FirstOrDefault(v2 => v2.ID == 1);

É necessario inserir o Include se não os Produtos ficam nulos.