Выбор ответа Middle Коллекции и LINQ спрашивают часто обновлено

IEnumerable и IQueryable

Вопрос

В EF Core метод репозитория возвращает IEnumerable<User> из db.Users. Вызывающий код делает .Where(u => u.Age > 18).Take(10). Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Все пользователи загрузятся, а фильтр пройдёт в памяти. Тип возврата IEnumerable<User заставляет компилятор выбрать Enumerable.Where вместо Queryable.Where.

Варианты ответа

  1. Фильтр и Take попадут в SQL, как и с IQueryable
  2. Ошибка компиляции: метода Take нет у интерфейса IEnumerable
  3. EF Core бросит исключение о клиентском вычислении
  4. Все пользователи загрузятся, а фильтр пройдёт в памятиправильный ответ

Разбор

Тип возврата IEnumerable<User> заставляет компилятор выбрать Enumerable.Where вместо Queryable.Where. Лямбда становится делегатом, а не деревом выражений, и EF не может перевести её в SQL: запрос SELECT * FROM Users вытянет всё, а фильтрация пройдёт в памяти. Take у IEnumerable есть. Исключение EF Core бросает, когда не может перевести выражение внутри IQueryable, а здесь до перевода дело не доходит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.