Коллекция вопросов ❓ на собеседовании в C# 🍧

Обзор вопросов по языка програмиированию C# и технологии NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

📚 В чём разница между `IEnumerable'T'` и `IQueryable'T'`?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Основные определения

IEnumerable<T>

IQueryable<T>


2️⃣ Deferred Execution (отложенное выполнение)


3️⃣ Где выполняется обработка

Характеристика IEnumerable IQueryable
Источник данных В памяти (объекты .NET) Внешний источник (БД, веб-сервис)
SQL/провайдер Нет Да, формирует запрос к источнику
LINQ методы Все выполняются в памяти Выражения преобразуются в Expression Tree → выполняются удалённо
Поддержка сложных запросов Ограничена (в памяти) Полная, если провайдер поддерживает

4️⃣ Примеры различий

IEnumerable<T>

List<int> numbers = new() {1,2,3,4,5};
var query = numbers.Where(n => n > 2).Select(n => n * 2);

foreach(var n in query) Console.WriteLine(n); // выполняется в памяти

IQueryable<T> (например, Entity Framework)

var query = db.Users
    .Where(u => u.Age > 18)
    .Select(u => new { u.Name, u.Age });

var result = query.ToList(); // SQL запрос к БД выполняется здесь

5️⃣ Когда использовать


6️⃣ Производительность


7️⃣ Каверзные моменты на собеседовании

  1. Что происходит при смешении IEnumerable<T> и IQueryable<T>?

    var result = db.Users.AsEnumerable().Where(u => u.Age > 18);
    
    • AsEnumerable() переводит IQueryable в IEnumerable → дальнейшие фильтры выполняются в памяти, а не в SQL.
  2. Deferred execution

    • Часто спрашивают, когда именно выполняется запрос. Ответ: только при фактической итерации (foreach, ToList(), Count(), First()).
  3. Что такое Expression Tree?

    • В IQueryable каждый метод LINQ создаёт Expression → можно преобразовать в SQL или другой провайдерский код.
  4. Можно ли использовать сложные функции C# в IQueryable?

    • Нет, только то, что провайдер может транслировать (например, EF Core может не поддерживать все методы).
  5. Память

    • IEnumerable работает в памяти → нагрузка на RAM.
    • IQueryable может использовать отложенную выборку → меньше памяти.
  6. Вызовы методов

    • IEnumerable<T> — методы LINQ вызываются в C# коде.
    • IQueryable<T> — методы формируют дерево выражений → выполняются в источнике данных.

8️⃣ Пример различий

// IQueryable -> SQL
var query1 = db.Users.Where(u => u.Name.StartsWith("A"));
// SQL генерируется при ToList()

// IEnumerable -> в памяти
var query2 = db.Users.ToList().Where(u => u.Name.StartsWith("A"));
// Все пользователи загружены, фильтрация в памяти

9️⃣ Таблица основных отличий

Характеристика IEnumerable IQueryable
Namespace System.Collections.Generic System.Linq
Основа Делегаты C# Expression Tree
Источник данных In-memory Remote / DB / External
Deferred execution Да Да, с генерацией выражения
SQL / Provider translation Нет Да
Преобразования LINQ to Objects LINQ to Entities / LINQ to SQL
Производительность Может быть медленнее для больших данных Оптимизировано для источника
Поддержка методов C# Все Только методы, поддерживаемые провайдером
Аллокация памяти Вся коллекция Только нужные элементы

⬆ Вернуться к главной

✨Dvurechensky✨