Выбор ответа Middle Коллекции и LINQ спрашивают часто обновлено
IEnumerable и IQueryable
Вопрос
В EF Core метод репозитория возвращает IEnumerable<User> из db.Users. Вызывающий код делает .Where(u => u.Age > 18).Take(10). Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Все пользователи загрузятся, а фильтр пройдёт в памяти. Тип возврата IEnumerable<User заставляет компилятор выбрать Enumerable.Where вместо Queryable.Where.
Варианты ответа
- Фильтр и
Takeпопадут в SQL, как и сIQueryable - Ошибка компиляции: метода
Takeнет у интерфейсаIEnumerable - EF Core бросит исключение о клиентском вычислении
- Все пользователи загрузятся, а фильтр пройдёт в памятиправильный ответ
Разбор
Тип возврата IEnumerable<User> заставляет компилятор выбрать Enumerable.Where вместо Queryable.Where. Лямбда становится делегатом, а не деревом выражений, и EF не может перевести её в SQL: запрос SELECT * FROM Users вытянет всё, а фильтрация пройдёт в памяти. Take у IEnumerable есть. Исключение EF Core бросает, когда не может перевести выражение внутри IQueryable, а здесь до перевода дело не доходит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.