В чем разница между IQueryable и IEnumerable
Я понимаю разницу. Будучи довольно новым для .Net, я знаю, что могу запросить IEnumerables использование расширений Linq. Так что же это IQueryable а чем это отличается?
Смотрите также, в чем разница между IQueryable[T] и IEnumerable[T]? это совпадает с этим вопросом.
7 ответов:
IEnumerable<T>представляет только прямой курсорT. .NET 3.5 добавлены методы расширения, которые включалиLINQ standard query operatorsкакWhereиFirst, С любыми операторами, которые требуют предикатов или анонимных функций, принимающихFunc<T>.
IQueryable<T>реализует те же стандартные операторы запросов LINQ, но принимаетExpression<Func<T>>для предикатов и анонимных функций.Expression<T>- это скомпилированное дерево выражений, разбитая версия метода ("наполовину скомпилированная", если хотите), которая может быть анализируется поставщиком объекта запроса и используется соответствующим образом.например:
IEnumerable<Person> people = GetEnumerablePeople(); Person person = people.Where(x => x.Age > 18).FirstOrDefault(); IQueryable<Person> people = GetQueryablePeople(); Person person = people.Where(x => x.Age > 18).FirstOrDefault();в первом блоке
x => x.Age > 18- это анонимный метод (Func<Person, bool>), который может быть выполнен как любой другой метод.Enumerable.Whereвыполнит метод один раз для каждого человека,yielding значения, для которых метод возвращаетtrue.во втором блоке
x => x.Age > 18- это дерево выражения (Expression<Func<Person, bool>>), который можно рассматривать как "свойство"Возраст" > 18".это позволяет таким вещам, как LINQ-to-SQL, существовать, потому что они могут анализировать дерево выражений и преобразовывать его в эквивалентный SQL. И потому что провайдеру не нужно выполнять до
IQueryableперечисляется (реализуетIEnumerable<T>, в конце концов), он может объединять несколько операторов запроса (в приведенном выше примереWhereиFirstOrDefault), чтобы сделать более разумный выбор о том, как выполнить весь запрос против базового источника данных (например, с помощьюSELECT TOP 1in язык SQL.)посмотреть:
в реальной жизни, если вы используете ORM, как LINQ-to-SQL
- при создании
IQueryable, то запрос может быть преобразован в sql и запущен на сервере баз данных- при создании
IEnumerable, то все строки будут извлечены в память как объекты перед запуском запроса.в обоих случаях, если вы не называете
ToList()илиToArray()тогда запрос будет выполняться каждый раз, когда он используется, поэтому, скажем, у вас естьIQueryableи вы заполняете 4 списка коробки от него, то запрос будет выполняться против базы данных 4 раза.также, если вы расширяете свой запрос:
q.Select(x.name = "a").ToList()затем с
IQueryableсгенерированный SQL будет содержатьwhere name = "a", но сIEnumerableмногие другие роли будут удалены из базы данных, а затемx.name = "a"проверка будет выполнена .NET.
"основное различие заключается в том, что методы расширения, определенные для IQueryable, принимают объекты Expression вместо объектов Func, то есть делегат, который он получает, является деревом выражений вместо метода для вызова. IEnumerable отлично подходит для работы с коллекциями в памяти, но IQueryable позволяет использовать удаленный источник данных, например базу данных или веб-службу"
источник: здесь
IEnumerable IEnumerable лучше всего подходит для работы с коллекцией в памяти. IEnumerable не перемещается между элементами, это только коллекция вперед.
IQueryable IQueryable лучше всего подходит для удаленного источника данных, например базы данных или веб-службы. IQueryable-это очень мощная функция, которая позволяет использовать различные интересные сценарии отложенного выполнения (например, запросы на основе подкачки и композиции).
Итак, когда вы должны просто перебирайте коллекцию в памяти, используйте IEnumerable, если вам нужно выполнить какие-либо манипуляции с коллекцией, например Dataset и другими источниками данных, используйте IQueryable
принципиальная разница заключается в том, что IEnumerable будет перечислять все свои элементы все время, в то время как IEqueryable будет перечислять элементы или даже делать другие вещи, основанные на запросе. Запрос-это выражение (представление данных кода .Net), которое IQueryProvider должен исследовать/интерпретировать/компилировать/что угодно для получения результатов.
наличие выражения запроса дает два преимущества.
первым преимуществом является оптимизация. Потому что модификаторы типа 'где' включенные в выражение запроса, IQueryProvider может применять в противном случае невозможные оптимизации. Вместо того, чтобы возвращать все элементы, а затем выбрасывать большинство из них из-за предложения "Where", поставщик может использовать хэш-таблицу для поиска элементов с заданным ключом.
второе преимущество-гибкость. Поскольку выражения являются исследуемыми структурами данных, вы можете выполнять такие действия, как сериализация запроса и отправка его на удаленную машину (например. разделяемый).
IQueriable-это то же самое, что и IEnumerable, но он также предоставляет дополнительную функциональность для реализации пользовательских запросов с помощью Linq. Вот описание на MSDN:http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx
во-первых IEnumerable находятся в системе.Коллекции пространства имен в то время как IQueryable находятся в системе.Пространство Имен Linq. Если вы используете IEnumerable при запросе данных из коллекций в памяти, таких как List, Array collection и т. д., а также при запросе данных из коллекции out-memory (например, удаленной базы данных, службы), поэтому вы используете IQueryable. Поскольку при запросе данных из базы данных IEnumerable выполняет запрос select на стороне сервера, загружает данные в память на стороне клиента, а затем фильтрует данные. Следовательно, делает больше работы и становится медленным. При запросе данных из базы данных IQueryable выполняет запрос select на стороне сервера со всеми фильтрами. Следовательно делает меньше работы и становится быстрым.
Comments