Материализуйте частичный набор результатов с EF Core 2.1 - PullRequest
0 голосов
/ 02 сентября 2018

Допустим, у меня есть большая коллекция задач, хранящихся в БД, и я хочу получить последнюю из них в соответствии с запросом разрешений пользователя. Логика проверки разрешений сложна и не связана с уровнем персистентности, поэтому я не могу поместить ее в запрос SQL. Сегодня я получаю ВСЕ задачи из БД, упорядоченные по убыванию, а затем фильтрую их по установленным разрешениям и выбираю первую. Не идеальное решение: я получаю тысячи объектов, когда мне нужен только один.

Мой вопрос: как я могу материализовать объекты, поступающие из БД, пока не найду объект, который соответствует моим критериям и отбросит остальные результаты?

Я думал об одном решении, но не смог найти информацию о поведении EF Core в этом случае и не знаю, как это проверить сам:

Создайте IQueryable, приведите к IEnumerable, затем выполните итерацию по нему и выполните первую хорошую задачу. Я знаю, что часть IQueryable будет выполняться на сервере и IEnumerable на клиенте, но я не знаю, будет ли выполнена вся задача перед применением FilterByPermissions или она будет выполнена по требованию? И мне также не нравится синхронный характер этого решения.

    IQueryable<MyTask> allTasksQuery = ...;
    IEnumerable<MyTask> allTasksEnumerable = allTasksQuery.AsEnumerable();

    IEnumerable<MyTask> filteredTasks = FilterByPermissions(allTasksEnumerable);
    MyTask latestTask = filteredTasks.FirstOrDefault();

Обходным путем может быть получение небольших наборов данных (например, страниц по 50), пока не будет найдено одно хорошее задание, но оно мне не нравится.

...