IEnumerable<T>
Существует множество способов хранения набора вещей в Списке, Массиве, Базе данных и т. Д. Общим для этих механизмов хранения является то, что набор вещей может быть Enumerated , то есть каждая из них может быть доступна одна за другой с использованием языковой конструкции, такой как, например, foreach
.
Интерфейс IEnumerable<T>
представляет тот общий интерфейс, который все владельцы наборов вещей должны включить перечисление. Следовательно, IEnumberable<Person
представляет интерфейс, который позволяет перечислять набор Person
объектов, не говоря уже о том, каким образом эти объекты хранятся.
IQueryable<T>
Это расширение IEnumerable<T>
, но оно представляет собой что-то специфическое для LINQ. В LINQ вы можете указать запрос , который может фильтровать и преобразовывать набор (или наборы) элементов. В отличие от чисто IEnumerable<T>
интерфейса это будет называться LINQ to Objects, в котором каждый этап запроса в конечном итоге представляет собой простой вызов метода расширения.
Однако с объектом, который реализует IQueryable<T>
, все может быть более изощренным. Объект, реализующий IQueryable<T>
, может быть связан с другим провайдером LINQ , который может реализовывать выполнение запросов LINQ другим способом. Например, IQueryable<Person>
может быть реализовано типом, связанным с поставщиком LINQ-To-SQL. В этом случае запрос LINQ преобразуется в запрос T-SQL, выполняемый для базы данных, чтобы получить набор элементов (результат не обязательно может быть набором Person
объектов).