No vídeo o seguinte código é feito:
using(var contexto2 = new LojaContext())
        {
            var promocao = contexto2
                .Promocoes
                .Include(p => p.Produtos)
                .ThenInclude(pp => pp.Produto)
                .FirstOrDefault();
            Console.WriteLine("\nMotrando os produtos da promoção...");
            foreach(var item in promocao.Produtos)
            {
                Console.WriteLine(item.Produto);
            }
        }Tive bastante dificuldade para entender e ainda não sei se entendi 100%. Existiria alguma analogia para ajudar o entendimento? Fiz os seguintes comentários no meu código para tentar facilitar passo a passo:
var promocao = contexto.Promocoes //Para obter os produtos da promocao, é preciso acessar 
                                                  //a tabela de produtos correspondentes à promoção, 
                                                  //acessando primeiro o intermediário PromocaoProduto
                    .Include(p => p.Produtos)  //Inclui a entidade/classe PromocaoProduto 
                                               //É como um join da tabela Promocoes na table PromocaoProduto, pelo critério de produtos
                    .ThenInclude(pp => pp.Produto) //pp é objeto tipo PromocaoProduto, e selecionamos pelo Produto
                                                   //Assim incluímos o Produto no resultado, vindo de promoções
                                                   //Novamente é como um segundo join na tabela produtos
                                                   //Isto tudo resulta numa lista de produtos
                    .First(x => x.Id == 1);    // Por fim selecionamos se iremos querer por index da promoção, 
                                               //a lista de todas as promoções, etcIsso está acurado?
 
             
            