繁体   English   中英

.NET Core 3 中的 EF LINQ 查询问题

[英]Issue with EF LINQ query in .NET Core 3

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

 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 的专家。

GetOrder需要将Expression<Func<Order, bool>>作为condition参数而不是Func<Order, bool>

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

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

_context.Orders
        .Where(condition)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM