1

我正在处理一个我无法在 ef core 3.0 上工作的查询,它在 2.1 版本中运行良好,我想知道是否有人可以帮助我弄清楚如何让它在 3.0 版本中工作。

所以让我从挑战开始。

我有一个名为 Zone 的表,它与名为 Bin 的表具有一对多的关系,而 bin 与名为 BinItems 的表具有一对多的关系,而 BinItem 与名为 PlanItem 的表具有一对一的关系, PlanItem 与名为 Plan 的表具有一对一的关系。

所以我想获取计划表中所有计划的列表,但它必须满足计划项目在指定区域列表的区域中的条件。所以假设我有一个 ZoneIds 列表,我正在寻找他们相关的 bin 项目位于该区域内的所有计划。

所以这是我在 2.1 版本中使用的查询,并且一直工作到迁移到 3.0。

var filterQuery = _PlanRepository.Table;
filterQuery = filterQuery.Where(x => x.Items.Where(o => o.BinItem != null 
                                         && o.BinItem.Bin != null
                                         && o.BinItem.Bin.Zone != null)
                                 .Select(y => y.BinItem.Bin.Zone.Id)
                                 .Intersect(PlanFilter.WarehouseIds).Any());

var finalQuery = filterQuery
                     .Include(x => x.Items)
                           .ThenInclude(x => x.BinItem)
                           .ThenInclude(x => x.Bin)
                           .ThenInclude(x => x.Zone)
                           .AsQueryable();

现在这给了我一个类似下面的错误。

Zone, "Id") != null), selector: (y) => y.BinItem.Bin.Zone.Id), source2: (Unhandled parameter: __PlanFilter_WarehouseIds_0))' by 'NavigationExpandingExpressionVisitor' 失败。这可能表示 EF Core 中的错误或限制。看https://go.microsoft.com/fwlink/?linkid=2101433了解更多详细信息。在 Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ExpandNavigationsInExpression(NavigationExpansionExpression 源,表达式表达式)在 Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ProcessWhere(NavigationExpansionExpression 源,LambdaExpression 谓词)

谁能分享我如何让它在 Ef core 3.0 版本中工作?

4

1 回答 1

4

好的,我想通了。

这是我的新代码。

                query = query.Where(x => x.Items.Where(o => o.BinItem != null
                                                     && o.BinItem.Bin != null
                                                     && o.BinItem.Bin.Zone != null
                                                     && PlanFilter.WarehouseIds.Contains(o.BinItem.Bin.Zone.Id)).Any());
于 2019-12-04T20:20:42.013 回答