Отличие IEnumerable от IQueryable

Отличие IEnumerable от IQueryable

Сейчас проходя интервью на новый проект мне задали вопрос о различиях между IEnumerable и IQueryable. Я, признаться откровенно, не так много работал с Entity Framework так что для меня этот вопрос стал небольшим тупиком. Потому после интервью я решил конкретно разобраться в этой теме и как оказалось разбираться нужно не особо и долго.

MSDN нас приводит к тому что IQueryable является наследником IEnumerable.

public interface IQueryable : IEnumerable

Следовательно два этих интерфейса имеют схожее предназначение и используются как итераторы. Осталось определить различие между ними, которое как раз и кроется в реализации.

IEnumerable<User> users = context.Users;
var user1 = users.First(u => u.FirstName.Equals("Mark"));

Этот код выглядит вполне рабочим и так на самом деле и есть. Если мы обратимся к переменной users, то она будет содержать всех пользователей из таблицы Users базы данных. Далее мы просто ищем нужного нам пользователя по имени.

В целом этот код работает как надо. Единственная проблема заключается в том, что перед тем как найти нужного пользователя мы запихнули контекст целой таблицы в одну переменную. Это не так критично, когда в таблице 10-20 записей и уже довольно неприятно, когда пользователей штук 100.

Чтобы избежать этой проблемы и был разработан интерфейс IQueryable, который позволяет выбирать из таблицы только необходимые нам данные. Работает это следующим образом.

IQueryable<User> users = context.Users;
var user1 = users.First(u => u.FirstName.Equals("Mark"));

Для этого кода будет сгенерирован следующий SQL-запрос:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName]
    FROM [dbo].[Users] AS [Extent1]
    WHERE N'Mark' = [Extent1].[FirstName]

Как видно мы не выбираем всю таблицу а получаем только те данные которые необходимы нам в данный момент времени. Использование IQueryable для больших объемов данных позволит значительно сэкономить ресурсы.

Комментарии

Оставить комментарий