IEnumerable
представляет собой последовательность элементов, которые вы перечисляете один за другим, пока не найдете ответ, который вам нужен, например, если бы я хотел, чтобы все объекты, у которых было какое-то свойство больше 10, мне нужно было пройти каждый поворачивать и возвращать только те, которые соответствуют. Вытягивание каждой строки таблицы базы данных в память для этого не могло бы быть отличной идеей.
IQueryable
с другой стороны, представляет собой совокупность элементов, на которых такие операции, как фильтрация могут быть отложены до базового источника данных, так что в случае фильтрации, если бы я реализовать IQueryable
на верхней часть пользовательского источника данных (или использовании LINQ to Entities!), То я мог бы приложить тяжелую работу по фильтрации/группировке и т. Д. К источнику данных (например, к базе данных).
Основной недостаток IQueryable
заключается в том, что реализация его довольно сложна - запросы построены как деревья выражений, которые, как разработчик, вам необходимо проанализировать, чтобы разрешить запрос. Если вы не планируете писать провайдера, то это не повредит вам.
Еще один аспект IQueryable, о котором стоит знать (хотя на самом деле это всего лишь общая оговорка о передаче обработки в другую систему, которая может создавать разные предположения о мире) заключается в том, что вы можете найти такие вещи, как работа сравнения строк как они поддерживаются в исходной системе, а не так, как они реализуются потребителем, например если ваша исходная база данных не чувствительна к регистру, но сравнение по умолчанию в .NET учитывает регистр.