Допустим, у меня есть большая коллекция задач, хранящихся в БД, и я хочу получить последнюю из них в соответствии с запросом разрешений пользователя. Логика проверки разрешений сложна и не связана с уровнем персистентности, поэтому я не могу поместить ее в запрос 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), пока не будет найдено одно хорошее задание, но оно мне не нравится.