我一直试图将一个在我的应用程序中经常执行的查询转换为编译查询,但没有成功。我将其归结为一个简单的查询,因此得出结论,我一定是误解了某些东西是如何工作的。
下面是不使用compile query的简单示例查询(这是有效的):
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<Entities, int, string, System.Collections.Generic.IEnumerable<Users>>
隐式转换为System.Func<Entities, int, string, System.Linq.IQueryable<Users>>
。存在显式转换(是否缺少强制转换?)
对于我的生活,我不知道我做错了什么...任何建议?
2条答案
按热度按时间tquggr8v1#
如何使EF-Core(2.1)编译查询返回IQueryable?
所有的
EF.Compile
方法返回IEnumerable<TResult>
或TResult
,而对应的Async
方法分别返回AsyncEnumerable<TResult>
或Task<TResult>
。正如你所看到的,没有
IQueryable<T>
返回方法,换句话说,编译后的查询应该是final的(不可组合的)--重载允许你传递必要的参数。我不能确切地说为什么会这样,EF Core文档中对显式编译查询的解释是:
尽管通常EF Core可以基于查询表达式的散列表示自动编译和缓存查询,但通过绕过散列计算和缓存查找,允许应用程序通过调用委托使用已编译的查询,这种机制可用于获得少量性能增益。
看起来这个想法不仅缓存了
IQueryable
表达式树,而且跳过了将表达式树转换为内部使用的任何数据结构。x4shl7ld2#
只能返回IEnumerable类型,但可以使用AsQueryable触发它。