【问题标题】:EF Core 3.1 - Include filtering throw an error 'Lambda expression used inside Include is not valid.'EF Core 3.1 - 包含过滤抛出错误“包含内部使用的 Lambda 表达式无效。”
【发布时间】:2022-01-24 15:49:15
【问题描述】:

我有 Item 表(主)和 ItemAlt 表(子(列表)) 我想获取所有项目 alt 行,其中:

  1. ItemAlt.WarehouseId 等于参数warehouseId

  2. Item.Id 等于参数 itemId

    public async Task<Item> GetItemWithAlt(int itemId, int warehouseId)
    {
        var query = from i in _dbContext.Item.Include(a => a.ItemAlt.Where(c => c.WarehouseId == warehouseId && c.IsActive == true))
                    where i.IsActive.Equals(true) && i.Id.Equals(itemId)
                    select i;
        return await query.SingleOrDefaultAsync();
    }
    

问题是它在

中抛出异常“在Include中使用的Lambda表达式无效

.Where(c =&gt; c.WarehouseId == warehouseId &amp;&amp; c.IsActive == true)

你知道如何解决这个问题吗?

  • 我已经尝试搜索错误消息,但查询与我的不同

【问题讨论】:

    标签: c# .net entity-framework-core entity-framework-core-3.1


    【解决方案1】:

    过滤的包含仅在 EF Core 5.0 之后可用,为 docs 状态:

    此功能是在 EF Core 5.0 中引入的。

    因此,您需要将项目更新到相应的 .NET 和 EF Core 版本,或者将查询重写为使用过滤的ItemAlt 手动加入。

    或者尝试选择匿名类型并依赖关系修复。类似的东西(未测试):

    var result = await _dbContext.Item
        .Where(i => i.IsActive.Equals(true) && i.Id.Equals(itemId))
        .Select(i => new 
        {
            Item = i,
            ItemAlts = i.ItemAlt
                .Where(c => c.WarehouseId == warehouseId && c.IsActive == true))
                .ToList()
        }
        .SingleOrDefaultAsync();
    
    return result?.Item;
    

    【讨论】:

    • 谢谢,虽然我已经解决了,但是这个也可以
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2017-09-22
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多