首页 > 解决方案 > EF Core:Include 中使用的 Lambda 表达式无效

问题描述

我试图让我所有的活动ProductsGetByCategory),包括所有活动ProductSpecifications,但没有成功。

如果我执行注释块,我会得到异常

System.InvalidOperationException:在 Include 中使用的 Lambda 表达式无效

我的解决方案是让所有活动,然后使用该方法Products加载所有活动ProductSpecifications

LoadAllActiveSpecifications(products)

使用的问题LoadAllActiveSpecifications是我需要运行一个 for 循环来加载所有规范。

是否可以ProductSpecification隐式加载所有活动?

这是我的代码。有人可以告诉我我错过了什么吗?

public async Task<IEnumerable<Product>> GetByCategory(string code)
{
    /*
    // Following the example from Microsoft: https://docs.microsoft.com/en-us/ef/core/querying/related-data
    return await _context
                    .Products
                    .Include(p => p.Category)
                    .Include(product => product
                                            .Specifications
                                            .Where(specification => specification.IsActive))
                    .Where(product => product.IsActive)
                    .Where(p => p.Category.Code == code)
                    .ToListAsync();
    */

    var products = await _context
                            .Products
                            .Include(p => p.Category)
                            //.Include(p => p.Specifications)
                            .Where(p => p.IsActive)
                            .Where(p => p.Category.Code == code)
                            .ToListAsync();

    await LoadAllActiveSpecifications(products);

    return products;
}

private async Task LoadAllActiveSpecifications(List<Product> products)
{
    for (int index = 0; index < products.Count; index++)
    {
        var product = products[index];

        await LoadSpecActiveAsync(product);
    }
}

private async Task LoadSpecActiveAsync(Product product)
{
    await _context
            .Entry(product)
            .Collection(p => p.Specifications)
            .Query()
            .Where(s => s.IsActive)
            .LoadAsync();
}

提前致谢

干杯

标签: c#.netentity-frameworkasp.net-core

解决方案


根据定义,EF 将加载完整的实体图。您可以在 EF Core ( https://docs.microsoft.com/en-us/ef/core/querying/filters )中分配全局查询过滤器来处理诸如软删除之类的规则,这将允许 EF 仅返回“活动”适用实体的行。EF6 在动态查询中有类似的东西。


推荐阅读