Является ли IQueryable запросом или просто объектом, который можно запросить?

Я немного смущен тем, что на самом деле представляет собой интерфейс IQueryable.

В документации MSDN для IQueryable говорится: «Предоставляет функциональные возможности для оценки запросов к определенному источнику данных».

В документации для IQueryProvider сказано: "Определяет методы для создания и выполнения запросов, которые описываются объектом IQueryable".

Название и сводка документации предполагают, что это хранилище объектов/данных, которое можно запрашивать. Вторая цитата и тот факт, что класс ObjectQuery из Entity Framework реализует IQueryable, предполагают, что это запрос, который можно выполнить.

Я что-то не так понял или это действительно нечетко?


person Albic    schedule 27.12.2009    source источник
comment
Вы пытались прочитать раздел «Примечания» для интерфейса IQueryable? Там есть дополнительная информация и пояснения.   -  person Alexandra Rusina    schedule 28.12.2009


Ответы (3)


IQueryable представляет сам запрос. С ним будет связан источник данных, но это не само хранилище данных. В частности, обычно не все данные хранятся в памяти.

Вы можете думать об этом немного как об объекте SqlCommand — у него есть запрос, он знает, что запрашивать для данных, но он не содержит самих данных.

person Jon Skeet    schedule 27.12.2009
comment
Но почему тогда он называется IQueryable? Это главный источник моего замешательства. Тогда IQuery было бы более подходящим именем. - person Albic; 28.12.2009
comment
@Albic: Боюсь, я не знаю, что касается именования. - person Jon Skeet; 28.12.2009

IQueryable представляет источник, относительно которого могут выполняться запросы. Это может быть представление таблицы на сервере SQL или коллекция объектов в памяти.

IQueryProvider представляет объект, который может создавать и выполнять запросы, представленные деревьями выражений. Поставщик запросов LINQ-to-SQL, например, возьмет деревья выражений и вернет IQueryable, что позволит вам перебрать (чтобы получить результаты) или уточнить (путем составления запросов) перед перебором.

В MSDN есть очень хорошее пошаговое руководство по созданию собственного IQueryProvider. Я думаю, что если вы сделаете это прохождение, у вас будет гораздо лучшее понимание.

person jason    schedule 27.12.2009
comment
А выражение представляет собой сам запрос, верно? С другой стороны, метод IQueryProvider.CreateQuery‹T› возвращает IQueryable‹T›. Меня смущает это противоречивое название. - person Albic; 28.12.2009

IQueryable представляет две (возможно, очень разные) вещи. Он представляет собой запрос в виде ссылки на дерево выражений, описывающее некоторый код, и источник данных в виде ссылки на «поставщика», который знает, как выполнить запрос.

Я думаю, что источник вашей путаницы связан с тем, что документы могут говорить только о методах, которые IQueryable фактически определяет. Большая часть возможностей IQueryable связана с реализацией связанных с ним методов расширения, определенных в классе Queryable, но они не являются строго частью интерфейса IQueryable.

Интересный!

Обновление: перечитывая ваш вопрос, еще одна полезная информация заключается в том, что запрос сам по себе может запрашиваться. Это ключ к включению композиционности в LINQ. Таким образом, IQueryable — это запрос, и его можно запрашивать, поэтому в имени типа нет противоречия.

person Pete Montgomery    schedule 27.12.2009