В C# IQueryable<T>
и IEnumerable<T>
представляют интерфейсы для работы с коллекциями данных, но имеют принципиальные различия в подходе к выполнению запросов и обработке данных.
IEnumerable<T>
IEnumerable<T>
используется для работы с коллекциями данных в памяти. Он позволяет перебирать элементы последовательности, но не предоставляет механизмов для оптимизации выполнения запросов.
Пример работы с IEnumerable<T>
:
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = numbers.Where(n => n > 2);
В этом случае фильтрация выполняется в памяти после загрузки всех данных.
IQueryable<T>
IQueryable<T>
предназначен для работы с удаленными источниками данных (например, базами данных). Он поддерживает отложенное выполнение и позволяет строить SQL-запросы на уровне базы данных.
Пример работы с IQueryable<T>
:
IQueryable<User> users = dbContext.Users;
var result = users.Where(u => u.Age > 18);
На этом этапе запрос еще не выполнен. Фильтрация произойдет на стороне базы данных только после вызова методов материализации, таких как ToList()
, FirstOrDefault()
, Count()
и других.
Основные отличия
Характеристика | IEnumerable<T> | IQueryable<T> |
---|---|---|
Где выполняется запрос | В памяти (RAM) | На стороне провайдера данных (например, базы данных) |
Тип выполнения | Немедленное | Отложенное |
Оптимизация запроса | Нет | Да (если провайдер поддерживает) |
IEnumerable<T>
используется для работы с данными в памяти, а IQueryable<T>
– для эффективной работы с удаленными источниками данных или другими провайдерами, позволяя фильтровать и обрабатывать данные перед их загрузкой в память.