Как заставить скомпилированный запрос EF-Core (2.1) возвращать IQueryable? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытался преобразовать запрос, который часто выполняется в моем приложении, в скомпилированный запрос, но безуспешно.Я свел его к простому запросу, поэтому пришел к выводу, что я должен неправильно понимать, как что-то работает.

Вот простой пример запроса без использования запроса компиляции (это работает):

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>',Существует явное преобразование (вы пропустили актерский состав?)

Что касается жизни, я не могу понять, что я делаю неправильно ... какие-либо предложения?

1 Ответ

0 голосов
/ 26 ноября 2018

Как заставить скомпилированный запрос EF-Core (2.1) вернуть IQueryable?

Вы не можете.Все EF.Compile методы возвращают либо IEnumerable<TResult>, либо TResult, а соответствующие Async методы возвращают соответственно AsyncEnumerable<TResult> или Task<TResult>.

Как видите, IQueryable<T> методов возврата нет,Другими словами, скомпилированные запросы должны быть окончательными (не компонуемыми) - перегрузки позволяют передавать необходимые аргументы.

Я не могу точно сказать, почему это так.Объяснение явно скомпилированных запросов в документации EF Core:

Хотя в общем случае EF Core может автоматически компилировать и кэшировать запросы на основе хешированного представления выражений запросов,этот механизм может быть использован для получения небольшого выигрыша в производительности путем обхода вычисления хэша и поиска в кэше, что позволяет приложению использовать уже скомпилированный запрос при вызове делегата.

ПохожеИдея состоит в том, чтобы не только кэшировать дерево выражений IQueryable, но и пропустить преобразование дерева выражений в любую структуру данных, которую они используют внутри.

...