← Назад к вопросам

В чём разница между IEnumerable и IQueryable в LINQ? Когда использовать каждый из них?

1.0 Junior🔥 161 комментариев
#Entity Framework и ORM

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия между IEnumerable и IQueryable в LINQ

Основные отличия

IEnumerable и IQueryable — это два ключевых интерфейса в LINQ, которые определяют способ обработки данных. Они коренным образом отличаются философией работы и производительностью.

IEnumerable: In-Memory обработка

IEnumerable работает с данными в памяти (in-memory). Это интерфейс для итерации по коллекциям в памяти.

Характеристики:

  • Находится в System.Collections
  • Использует LINQ to Objects
  • Загружает все данные в память перед фильтрацией
  • Выполнение немедленное (eager evaluation)
  • Работает с массивами, List<T>, Dictionary<K,V> и т.д.

Пример:

List<User> users = GetAllUsersFromDatabase();

var filtered = users
    .Where(u => u.Age > 30)      // Фильтрует ВСЕ пользователей в памяти
    .OrderBy(u => u.Name)
    .Take(10);

// Все 10000 пользователей загружены, затем отфильтрованы

IQueryable:远程 обработка

IQueryable преобразует запрос в выражение (expression tree) и передаёт его провайдеру (БД, ORM и т.д.). Провайдер сам генерирует эффективный SQL или другой запрос.

Характеристики:

  • Находится в System.Linq
  • Использует провайдеры (Entity Framework, LINQ to SQL, etc.)
  • Загружает только нужные данные
  • Выполнение отложенное (deferred execution)
  • Генерирует SQL и выполняет на стороне сервера БД
  • Поддерживает асинхронные операции

Пример:

IQueryable<User> users = _dbContext.Users;

var filtered = users
    .Where(u => u.Age > 30)      // Преобразуется в SQL WHERE
    .OrderBy(u => u.Name)         // Преобразуется в SQL ORDER BY
    .Take(10);                    // Преобразуется в SQL LIMIT/TOP

// SQL: SELECT TOP 10 * FROM Users WHERE Age > 30 ORDER BY Name
// Загружаются только 10 пользователей

Когда использовать IEnumerable

Используй IEnumerable когда:

  • Работаешь с малыми коллекциями (< 1000 элементов)
  • Данные уже в памяти (List, Array)
  • Нужна простая обработка без сложных фильтров
  • Невозможно преобразовать логику в SQL
  • Используешь методы, которые нельзя перевести на стороне сервера

Пример:

var numbers = new[] { 1, 2, 3, 4, 5 };

var result = numbers
    .Where(n => n % 2 == 0)
    .Select(n => n * n)
    .ToList();  // [4, 16]

Когда использовать IQueryable

Используй IQueryable когда:

  • Работаешь с большими таблицами БД
  • Нужна фильтрация/сортировка на стороне сервера
  • Хочешь минимизировать трафик между приложением и БД
  • Используешь Entity Framework, LINQ to SQL или подобные ORM

Пример:

var users = _dbContext.Users
    .Where(u => u.Age > 30 && u.Department == "IT")
    .OrderByDescending(u => u.Salary)
    .Take(5)
    .ToList();

// Эффективный SQL запрос выполняется на БД
// Загружаются только 5 нужных записей

Важные правила

Расклад 1: Миграция из IEnumerable в IQueryable

// ❌ НЕПРАВИЛЬНО: загружаем 10000 записей
var users = _dbContext.Users.ToList();  // IEnumerable<User>
var filtered = users.Where(u => u.Age > 30).Take(10);

// ✅ ПРАВИЛЬНО: фильтруем на БД
var filtered = _dbContext.Users
    .Where(u => u.Age > 30)
    .Take(10)
    .ToList();  // IEnumerable<User> (только 10 записей)

Расклад 2: Смешивание провайдеров

// Осторожно! After .ToList() нельзя делать IQueryable операции
var users = _dbContext.Users.ToList();  // Загружаем в память
var filtered = users.Where(u => u.Age > 30);  // Работает, но медленнее

Расклад 3: Асинхронность

// IQueryable поддерживает async
var users = await _dbContext.Users
    .Where(u => u.Age > 30)
    .ToListAsync();  // Асинхронно загружает только нужные данные

Практический совет для интервью

Помни простую аналогию:

  • IEnumerable = foreach цикл по уже загруженным данным
  • IQueryable = запрос к БД, который выполняется один раз с оптимизацией

На большие данные всегда используй IQueryable с Entity Framework для экономии памяти и скорости.

В чём разница между IEnumerable и IQueryable в LINQ? Когда использовать каждый из них? | PrepBro