如何使EF-Core(2.1)编译查询返回IQueryable?

jce*_*ddy 2 linq iqueryable ef-core-2.1

我一直试图将在我的应用程序中执行很多的查询转换为已编译的查询,但没有成功。我将其归结为一个简单的查询,因此得出结论,我一定误会了某些东西是如何工作的。

这是不使用编译查询的简单示例查询(可行):

private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
    (Entities context) =>
        from au in context.Users select au;
Run Code Online (Sandbox Code Playgroud)

添加编译查询调用后:

private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
    EF.CompileQuery((Entities context) =>
        from au in context.Users select au);
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

无法将类型'System.Func>'隐式转换为'System.Func>'。存在显式转换(您是否缺少演员表?)

对于我的一生,我无法弄清楚自己在做什么错...任何建议?

Iva*_*oev 8

如何使EF-Core(2.1)编译查询返回IQueryable?

你不能 所有EF.Compile方法都返回IEnumerable<TResult>TResult,而相应Async方法分别返回AsyncEnumerable<TResult>Task<TResult>

如您所见,没有IQueryable<T>返回方法。换句话说,编译后的查询应该是最终的(不可组合的)-重载使您可以传递必要的参数。

我不能确切地说为什么。EF Core文档中对“ 显式编译查询 ”的解释是:

尽管通常EF Core可以基于查询表达式的散列表示自动编译和缓存查询,但是通过绕过哈希的计算和缓存查找,该机制可用于获得较小的性能提升,从而允许应用程序使用通过调用委托已编译的查询。

看起来这个想法不仅是要缓存IQueryable表达式树,而且还要跳过表达式树对它们内部使用的任何数据结构的转换。