我一直试图将在我的应用程序中执行了很多次的查询转换为编译后的查询,但是没有成功。我将其归结为一个简单的查询,因此得出结论,我一定误会了某些东西的工作原理。
这是不使用编译查询的简单示例查询(有效):
private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
(Entities context) =>
from au in context.Users select au;
一旦我添加了编译查询调用:
private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
EF.CompileQuery((Entities context) =>
from au in context.Users select au);
我收到此异常:
无法将类型'System.Func>'隐式转换为'System.Func>'。存在显式转换(您是否缺少演员表?)
对于我的一生,我无法弄清楚自己在做什么错...任何建议?
答案 0 :(得分:4)
如何使EF-Core(2.1)编译查询返回IQueryable?
不能。所有EF.Compile
方法都返回IEnumerable<TResult>
或TResult
,相应的Async
方法分别返回AsyncEnumerable<TResult>
或Task<TResult>
。
如您所见,没有IQueryable<T>
返回方法。换句话说,编译后的查询应该是最终的(不可组合的)-重载使您可以传递必要的参数。
我不能确切地说为什么。 EF Core文档中的Explicitly Compiled Queries的解释是:
尽管通常情况下,EF Core可以基于查询表达式的散列表示自动编译和缓存查询,但是通过绕过哈希的计算和缓存查找,可以使用此机制来获得较小的性能提升,从而允许应用程序通过调用委托来使用已经编译的查询。
看起来这个想法不仅是要缓存IQueryable
表达式树,而且还要跳过将表达式树转换为内部使用的任何数据结构的方法。
答案 1 :(得分:0)
您只能返回 IEnumerable 类型,但您可以使用 AsQueryable 触发它。