3
respostas

Filtro não funcionou

Fiz o seguinte código para buscar as compras acima de 3 reais de determinado produto:

static void Main(string[] args)
        {
            using (var contexto = new LojaContext())
            {
                LogSql(contexto);
                //Compras acima de 3 reais do Produto
                var p1 = contexto.Produtos
                    .Where(p => p.Id == 3002)
                    .FirstOrDefault();
                contexto.Entry(p1)
                    .Collection(p => p.Compras)
                    .Query()
                    .Where(c => c.Preco > 3.0)
                    .Load();
                Console.WriteLine($"Compras do produto {produto.Nome} com condicional");
                foreach (var compra in p1.Compras)
                {
                    Console.WriteLine($"{compra.Quantidade} {compra.Produto.Unidade} de {compra.Produto.Nome} no valor de {compra.Preco}");
                }
            }
        }

No log a saída das queries foi:

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


Executed DbCommand (5ms) [Parameters=[@__get_Item_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SELECT [e].[Id], [e].[Preco], [e].[ProdutoId], [e].[Quantidade]
FROM [Compras] AS [e]
WHERE ([e].[ProdutoId] = @__get_Item_0) AND ([e].[Preco] > 3.0E0)

Compras do produto Pão Francês com condicional
6 Unidade de Pão Francês no valor de 2,4

Porque a compra no valor de 2,4 retornou? (OBS: Só tem essa compra na tabela. Esperava que nada fosse exibido no console com essa condição.)

Obrigado,

3 respostas

Olá Matheus!

É bem estranho isso, principalmente porque na query o valor que está comparando é 3.0E0. E isso é bem estranho. O campo Preco é de qual tipo?

É recomendado usar decimal quando se usa dinheiro.

Caso não seja isso, tentaremos ajudar com o possível!

Bons estudos!

Segue o código de criação da minha tabela gerado pelo Visual Studio:

CREATE TABLE [dbo].[Compras] (
    [Id]         INT        IDENTITY (1, 1) NOT NULL,
    [Quantidade] INT        NOT NULL,
    [ProdutoId]  INT        NOT NULL,
    [Preco]      FLOAT (53) NOT NULL,
    CONSTRAINT [PK_Compras] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Compras_Produtos_ProdutoId] FOREIGN KEY ([ProdutoId]) REFERENCES [dbo].[Produtos] ([Id]) ON DELETE CASCADE
);


GO
CREATE NONCLUSTERED INDEX [IX_Compras_ProdutoId]
    ON [dbo].[Compras]([ProdutoId] ASC);

Realmente o EntityFrameworkCore não criou a tabela com tipo Decimal, mas segui a criação dela conforme feito no curso, com double para o preço:

Segue a classe Compra:

namespace Alura.Loja.Testes.ConsoleApp
{
    public class Compra
    {
        public int Id { get; set; }
        public int Quantidade { get; internal set; }
        public int ProdutoId { get; set; }
        public Produto Produto { get; internal set; }
        public double Preco { get; internal set; }
    }
}

Consegue saber o porque dos valores não estarem sendo corretamente comparados?

Matheus, o que pode ser feito, é explicitar que o campo Preco seja do tipo money.

Na sua classe de modelo, altere o tipo do Preco para decimal. Caso isso não funcione, inclua no seu OnModelCreating a seguinte instrução:

modelBuilder.Entity<Compra>()
                .Property(i => i.Preco)
                .HasColumnType("Money");

Mas de qualquer jeito, seu cálculo entre o preço unitário e a quantidade deveria retornar 3,0 e não 2,4. Em algum ponto do código tem algum problema com esses valores?

No aguardo.