linq - пример - В чем разница между IQueryable и IEnumerable




linq c# (5)

Я в замешательстве относительно разницы. Я довольно новичок в .NET, я знаю, что могу запросить IEnumerables используя расширения Linq. Итак, что это за IQueryable и как он отличается?

См. Также В чем разница между IQueryable [T] и IEnumerable [T]? который перекрывает этот вопрос.


«Основное различие заключается в том, что методы расширения, определенные для IQueryable, принимают объекты Expression вместо объектов Func, то есть делегат, который он получает, является деревом выражений вместо метода для вызова. IEnumerable отлично подходит для работы с коллекциями в памяти, но IQueryable позволяет для удаленного источника данных, например, базы данных или веб-службы "

Источник: here


IQueriable - это то же, что и IEnumerable, но также предоставляет дополнительные функции для реализации пользовательских запросов с Linq. Ниже приведено описание в MSDN: http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx


Во-первых, IEnumerable находятся в пространстве имен System.Collections, тогда как IQueryable находятся в пространстве имен System.Linq. Если вы используете IEnumerable при запросе данных из коллекций в памяти, таких как List, Array collection и т. Д. И при запросе данных из коллекций из памяти (например, удаленной базы данных, службы), поэтому вы используете IQueryable. Поскольку при запросе данных из базы данных IEnumerable выполняет запрос выбора на стороне сервера, загружает данные в памяти на стороне клиента и затем фильтрует данные. Следовательно, больше работает и становится медленным. При запросе данных из базы данных IQueryable выполняет запрос выбора на стороне сервера со всеми фильтрами. Следовательно, делает меньше работы и становится быстрым.


Принципиальная разница заключается в том, что IEnumerable будет перечислять все его элементы все время, в то время как IEqueryable будет перечислять элементы или даже делать другие вещи на основе запроса. Запрос представляет собой выражение (представление данных .Net-кода), которое IQueryProvider должен исследовать / интерпретировать / компилировать / что угодно, чтобы генерировать результаты.

Наличие выражения запроса дает два преимущества.

Первым преимуществом является оптимизация. Поскольку модификаторы типа «Где» включены в выражение запроса, IQueryProvider может применять в противном случае невозможную оптимизацию. Вместо того, чтобы возвращать все элементы, отбрасывая большинство из них из-за предложения «Where», поставщик может использовать хеш-таблицу для поиска элементов с заданным ключом.

Второе преимущество - гибкость. Поскольку Expressions являются исследуемыми структурами данных, вы можете делать такие вещи, как сериализация запроса и отправка его на удаленную машину (например, linq-to-sql).


IEnumerable IEnumerable лучше всего подходит для работы с коллекцией в памяти. IEnumerable не перемещается между элементами, это только передовая коллекция.

IQueryable IQueryable подходит для удаленного источника данных, например, базы данных или веб-службы. IQueryable - очень мощная функция, которая позволяет использовать множество интересных сценариев отложенного исполнения (например, запросы подкачки и композиции).

Поэтому, когда вам нужно просто перебирать коллекцию в памяти, используйте IEnumerable, если вам нужно делать какие-либо манипуляции с коллекцией, такой как Dataset и другими источниками данных, используйте IQueryable





.net-3.0