首页 > 解决方案 > 为什么我得到错误的过滤结果?

问题描述

我正在使用实体框架来获取 ID = 5002 的产品实体。每个产品都有一个订单列表。因此,我正在过滤订单以仅获取总计大于 10.00 的订单,但 EF 将完整列表返回给我。

using (var context = new SuperMarketContext())
{
    var product = context.Product
        .Include(p => p.Orders)
        .Where(p => p.Id == 5002)
        .First();

    context.Entry(product)
        .Collection(p => p.Orders)
        .Query()
        .Where(o => o.Total > 10)
        .Load();

    foreach (var item in product.Orders)
    {
        Console.WriteLine(item);
    }
}

就像我说的那样,它给我带来了所有订单,但只有超过 10 个的订单。为什么会这样?

EF 核心 1.1.2

.Net 框架 4.6.1

标签: c#entity-framework

解决方案


如果您已经拥有该产品的订单列表,为什么还要再次查询数据库?

固定到您的代码:

using (var context = new SuperMarketContext())
{
    var product = context.Product
        .Include(p => p.Orders)
        .Where(p => p.Id == 5002)
        .First();

    var filteredOrders = context.Entry(product)
        .Collection(p => p.Orders)
        .Query()
        .Where(o => o.Total > 10)
        .Load();

    foreach (var item in filteredOrders)
    {
        Console.WriteLine(item);
    }
}

我的建议:

选项1:

using (var context = new SuperMarketContext())
{
    var product = context.Product
        .Include(p => p.Orders)
        .Where(p => p.Id == 5002)
        .First();

    var orders = product.Orders.Where(o => o.Total > 10).ToList();

    foreach (var item in orders)
    {
        Console.WriteLine(item);
    }
}

选项 2:

using (var context = new SuperMarketContext())
{
    var product = context.Product
        .Include(p => p.Orders)
        .Where(p => p.Id == 5002 && p.Orders.Where(t => t.Total > 10))
        .First();

    foreach (var item in product.Orders)
    {
        Console.WriteLine(item);
    }
}

让我知道这些是否有效:)


推荐阅读