【问题标题】:Issue with EF LINQ query in .NET Core 3.NET Core 3 中的 EF LINQ 查询问题
【发布时间】:2020-09-27 05:24:02
【问题描述】:

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

【问题讨论】:

    标签: c# linq .net-core asp.net-core-3.0 ef-core-3.0


    【解决方案1】:

    GetOrder需要将Expression&lt;Func&lt;Order, bool&gt;&gt;作为condition参数而不是Func&lt;Order, bool&gt;

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

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

    _context.Orders
            .Where(condition)
    

    之前您的查询似乎是在客户端执行的,请参阅breaking changes list

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

    【讨论】:

    • 感谢您的回复!确实我是在客户端执行的,我对代码做了一些重构。如上所述添加参数表达式后,我在 .Where(x => condition(x)) 中出现错误,条件错误为“Method name expected”
    • @Tofetopo 把它改成Where(condition),看他更新。
    • 你说得对,感谢您的帮助并指出我那些重大更改列表!它们将来会很有用,因为我相信更多的查询会被破坏:)
    • @Tofetopo 很乐意提供帮助!
    猜你喜欢
    • 2022-11-22
    • 2020-02-01
    • 2020-03-29
    • 2021-02-22
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2020-01-25
    相关资源
    最近更新 更多