[英]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.