1

我已将我的 Web 应用程序升级到 NET Core 3,并且一些在 NET Core 2 中正确返回值的 EF LINQ 查询现在出错了。我的 OrderManager 类中有以下代码:

 private TResult GetOrder<TResult>(Func<Order, bool> condition, Func<Order, TResult> selector)
    {
        return _context.Orders
            .Where(x => condition(x))
                .Include(x => x.OrderStocks)
                    .ThenInclude(x => x.Stock)
                        .ThenInclude(x => x.Product)
                            .Select(selector).FirstOrDefault();
    }

    public TResult GetOrderById<TResult>(int id, Func<Order, TResult> selector)
    {
        return GetOrder(order => order.Id == id, selector);
    }

    public TResult GetOrderByReference<TResult>(string reference, Func<Order, TResult> selector)
    {
        return GetOrder(x => x.OrderRef == reference, selector);
    }

看起来 dotnet 3 不喜欢那个 .Where 语句:

System.InvalidOperationException:“无法翻译 LINQ 表达式 'DbSet .Where(o => Invoke(__condition_0, o[Order]) )”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

有谁知道如何正确重写此查询?我试图在行中添加 AsEnumerable():return _context.Orders 但这不是解决方法,我在这里有点受阻,因为我不是 LINQ 专家。

4

1 回答 1

1

GetOrder需要Expression<Func<Order, bool>>作为condition参数 not Func<Order, bool>

private TResult GetOrder<TResult>(Expression<Func<Order, bool>> condition, Func<Order, TResult> selector)

更改参数后,您还需要更改Where子句:

_context.Orders
        .Where(condition)

以前您的查询似乎是在客户端执行的,请参阅中断更改列表

虽然因为它是查询中的最后一条语句应该没Func问题selector,但请记住,它会将所有列提取到内存中,然后使用所需的列进行映射。

于 2020-06-08T09:23:06.200 回答