![]() |
刚分手的小刀 · Python爬虫入门到接单赚钱指南 - 哔哩哔哩· 1 年前 · |
![]() |
聪明伶俐的小马驹 · umy-ui表格解决卡顿问题_use-vir ...· 1 年前 · |
![]() |
高大的春卷 · Flutter 异常监控方案与实践 - ...· 2 年前 · |
![]() |
好帅的香菜 · VBA--单元格值的获取和设置 - 知乎· 2 年前 · |
![]() |
淡定的匕首 · 如何在Hazelcast中获得本地地图条目· 2 年前 · |
我能够使用except 运行各种动态组合查询,除非包含子查询 。
因此,这不是一个复制的 EF核心动态lambda子查询不工作 或任何其他我能够找到的事情。
可以在 Dotnetfiddle.net/4 4opEqr 上找到一个可运行的repro来演示这个问题,它使用一个动态组合的表达式来表示以下查询:
efContext.Products.Where(p => p.Id == efContext.OrderItem.Max(i => i.ProductId)).ToList();
我得到的例外是
System.InvalidOperationException : The LINQ expression 'InternalDbSet<OrderItem> { }
.Max(i => i.ProductId)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
我在Microsoft.EntityFrameworkCore.SqlServer中观察到了与Microsoft.EntityFrameworkCore.InMemory相同的行为(版本6.0.8和7.0.0-preview.7.22376.2)。
发布于 2022-09-12 19:36:12
问题似乎既在于EF Core处理表达式树内嵌套可查询表达式的方式,也包括您尝试测试所创建的动态表达式的方式。
很快,这里
productQueryable.Where(p => p.Id == orderItemQueryable.Max(i => i.ProductId))
productQueryable
是正则变量(
.Where
是常规调用),
orderItemQueryable
是编译器生成的闭包(作为可查询的
Where
谓词表达式的一部分)。
() => productQueryable.Where(p => p.Id == orderItemQueryable.Max(i => i.ProductId))
它们都是编译器生成的闭包。
因此,EF不能正确处理在“根”查询表达式中包含嵌套可查询变量值的
Constant
表达式,因此对于子查询,您应该直接传递
IQueryable.Expression
属性值,或者模拟闭包(而不是常量)表达式。对于根查询,您应该用常量表达式或模拟闭包(但不是直接)包装它。
因为包装可查询变量对这两种情况都有效,所以解决方案是始终将这些变量封装在闭包模拟表达式中。闭包仿真表达式是指包含常量表达式、保存类实例、在类、属性或字段中保存实际变量的表达式。
它可以通过多种方式实现,例如,使用
System.Tuple
类作为holder:
static Expression MakeClosure<T>(T value)
var closure = new Tuple<T>(value);
return Expression.Property(Expression.Constant(closure), nameof(closure.Item1));
}
或者真正的编译器生成闭包类实例:
static Expression MakeClosure<T>(T value)
var closure = new { value };
return Expression.Property(Expression.Constant(closure), nameof(closure.value));
![]() |
刚分手的小刀 · Python爬虫入门到接单赚钱指南 - 哔哩哔哩 1 年前 |
![]() |
好帅的香菜 · VBA--单元格值的获取和设置 - 知乎 2 年前 |
![]() |
淡定的匕首 · 如何在Hazelcast中获得本地地图条目 2 年前 |