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

Dúvida de como aplicar um filtro na coleção

Tenho três entidades:

public class Product
{
    public int Id { get; set; }
    public string Description { get; set; }

    public ICollection<ProductPrice> Prices { get; set; }
    public Product() => Prices = new HashSet<ProductPrice>();
}

public class ProductPrice
{
    public int ProductId { get; set; }
    public int ProductTypePriceId { get; set; }
    public decimal Price { get; set; }

    public Product Product { get; set; }
    public ProductTypeOfPrice ProductTypeOfPrice { get; set; }
}

public class ProductTypeOfPrice
{
    public int Id { get; set; }
    public string Description { get; set; }
}

Ao efetuar a sequinte query:

var query = DataContext.Products
    .Include(p => p.Prices)
    .OrderByDescending(p => p.Id)
    .Take(2)
    .ToList();

Tenho o retorno:

[
    {
        "id": 16642,
        "description": "PRODUTO 1",
        "prices": [
            {
                "productId": 16642,
                "productTypePriceId": 1,
                "price": 26.9
            },
            {
                "productId": 16642,
                "productTypePriceId": 2,
                "price": 21.65
            },
            {
                "productId": 16642,
                "productTypePriceId": 3,
                "price": 20.22
            }
        ]
    },
    {
        "id": 16641,
        "description": "PRODUTO 2",
        "prices": [
            {
                "productId": 16641,
                "productTypePriceId": 1,
                "price": 25.9
            },
            {
                "productId": 16641,
                "productTypePriceId": 2,
                "price": 21.65
            },
            {
                "productId": 16641,
                "productTypePriceId": 3,
                "price": 20.22
            }
        ]
    }
]

Como faço para filtrar somente o productTypePriceId == 1 e obter um retorno como abaixo?

[
    {
        "id": 16642,
        "description": "PRODUTO 1",
        "prices": [
            {
                "productId": 16642,
                "productTypePriceId": 1,
                "price": 26.9
            }
        ]
    },
    {
        "id": 16641,
        "description": "PRODUTO 2",
        "prices": [
            {
                "productId": 16641,
                "productTypePriceId": 1,
                "price": 25.9
            }
        ]
    }
]

Agradeço a atenção desde já! Obrigado.

2 respostas
solução!

Fala, Pedro, boa tarde. Tudo bem?

Cara, atualmente essa funcionalidade (a capacidade de filtrar entidades filhas após o Include()) não é suportada. Aliás, esse é um pedido constante no repositório do EF Core, . Veja a discussão aqui.

Lendo a discussão deles cheguei em uma sugestão de solução da própria MS que copio aqui. Se você não se importar em fazer várias consultas SQL é uma saída...

using (var DataContext = new LojaContexto())
{
    var query = DataContext.Products
        .OrderByDescending(p => p.Id)
        .Take(2);

    foreach (var product in query)
    {
        var specificPrice = DataContext.Entry(product)
            .Collection(p => p.Prices)
            .Query()
            .Where(pp => pp.ProductTypePriceId == 1);

        foreach(var price in specificPrice)
        {
            System.Console.WriteLine($"{product.Description} - {price.Price}");
        }
    }
}

Me dá um feedback sobre o que achou. Abraços!

Opa, tudo bom Daniel?

Obrigado pela resposta, mas a regra de negócio mudou e realmente continuei exibindo todas as tabelas de preços. Deixarei este link favoritado.

Abraço!