Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Filtro nao funciona

Olá amigo(a)s Fiz tudo exatamente igual ao da aula mas não deu resultado. Segui a dica do Fabiano Augusto Teodoro, troquei o tipo do preco na classe Compra na tabela pra money o que refletiu a troca na tabela Produtos tb pra money em PrecoUnitario na classe pra decimal, depois de tudo a mesma situação o filtro só traz um produto e não uma lista. Outro detlhe é que baixei o projeto final e deu na mesma situação.

Log de saída:

Executed DbCommand (5ms) [Parameters=[], CommandType='Text', CommandTimeout='30' ] SELECT TOP(1) [c].[Id], [c].[Nome], [e].[ClienteId], [e].[Bairro], [e].[Cidade], [e].[Complemento], [e].[Logradouro], [e].[Numero] FROM [Clientes] AS [c] LEFT JOIN [Enderecos] AS [e] ON [e].[ClienteId] = [c].[Id]

Endereço de entrega: Rua dos Inválidos

Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30' ] SELECT TOP(1) [p].[Id], [p].[Categoria], [p].[Nome], [p].[PrecoUnitario], [p].[U nidade] FROM [Produtos] AS [p] WHERE [p].[Id] = 2

Executed DbCommand (2ms) [Parameters=[@get_Item_0='?'], CommandType='Text', Co mmandTimeout='30'] SELECT [e].[Id], [e].[Preco], [e].[ProdutoId], [e].[Quantidade] FROM [Compras] AS [e] WHERE ([e].[ProdutoId] = @get_Item_0) AND ([e].[Preco] > 10.0)

Mostrando as compras do produto SqlServer Compra de 3 Unidade do produto SqlServer a R$ 59,6700 Pressione qualquer tecla para continuar. . .

Código Program.cs

    static void Main(string[] args)
    {
        using (var contexto = new LojaContext())
        {
            var serviceProvider = contexto.GetInfrastructure<IServiceProvider>();
            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
            loggerFactory.AddProvider(SqlLoggerProvider.Create());

            var cliente = contexto
                .Clientes
                .Include(c => c.EnderecoDeEntrega)
                .FirstOrDefault();

            Console.WriteLine($"Endereço de entrega: {cliente.EnderecoDeEntrega.Logradouro}");

            var produto = contexto
                .Produtos
                .Where(p => p.Id == 2)
                .FirstOrDefault();

            contexto.Entry(produto)
                .Collection(p => p.Compras)
                .Query()
                .Where(c => c.Preco > 10)
                .Load();

            Console.WriteLine($"Mostrando as compras do produto {produto.Nome}");
            foreach (var item in produto.Compras)
            {
                Console.WriteLine("\t" + item);
            }
        }
4 respostas

Você está buscando por apenas um produto, conforme o trecho a seguir

 var produto = contexto
                .Produtos
                .Where(p => p.Id == 2)
                .FirstOrDefault();

O que será uma lista é as compras (na qual você especificou que deseja obter apenas as que contém o valor da coluna "Preco" maior (>) que 10).

Olá Filipe Luiz , obrigado por sua presteza.

Mas é o seguinte, esse código é o código do professor, se você baixar o projeto finalizado do curso verá que estã assim e mesmo assim o resultado que deveria ser uma lista com os valores maiores que 10 não vem e sim apenas um resultado e isto pode ser visto no ultimo modulo do curso vídeo da aula (onde lá dá certo com esse código que já passei). Caminho da aula: AULA - 08 - Recuperando objetos relacionados Lá vc entra no vídeo: Populando coleções após a carga da entidade principal

  • Se vc entrar no forum pelo atalho da vídeo aula verá que o aluno: Mateus à 3 meses atrás teve o mesmo problema e na resposta que deram a ele eu fiz e não deu certo e o Mateus parece que desistiu pq nem comentou se deu certo ou não.

E mesmo que mude a condição para:

 var produto = contexto
                .Produtos
                .FirstOrDefault();

Se vc baixar o projeto do professor que tem o mesmo código, a diferença do meu é o tipo que mudei de dooble para decimal/money seguindo a sugestão de resposta que deram para o Mateus.

solução

Olá Cledson!

Baixei o projeto do Daniel e alterei o tipo dos valores para decimal, depois alterei o id do produto para poder listar e executei.

var produto = contexto
                .Produtos
                .Where(p => p.Id == 2002)
                .FirstOrDefault();

O resultado foi:

Depois executei alterando o filtro para:

contexto.Entry(produto)
                .Collection(p => p.Compras)
                .Query()
                .Where(c => c.Preco > 1)
                .Load();

E recebi apenas um resultado para o pão francês. Fui no meu banco de dados e vi que tinha apenas um registro de compra para esse produto, depois incluí mais um registro de compra para pão francês e o resultado foi o seguinte:

Como está no seu banco de dados? Na tabela Compras tem mais de um registro para o id que você está procurando? É desta tabela que irá trazer a lista.

No aguardo!

Olá Fabiano,

Obrigado !!!