Какие типы с возможностью создания экземпляров, реализующие IQueryable ‹T›, доступны в .Net 4.0?

Существуют ли в контексте C # в .Net 4.0 какие-либо встроенные объекты, реализующие IQueryable<T>?


person one.beat.consumer    schedule 07.02.2012    source источник


Ответы (3)


IQueryable объекты создаются поставщиками запросов (например, LINQ to SQL, LINQ to Entities / Entity Framework и т. д.). Практически ничто из того, что вы можете создать с new в базовой платформе .NET Framework, не реализует IQueryable.

IQueryable - это интерфейс, предназначенный для создания поставщиков запросов, которые позволяют использовать библиотеку LINQ во внешнем хранилище данных путем создания дерева выражений с возможностью синтаксического анализа. По своей природе Queryables требует контекста - информации о том, что именно вы запрашиваете. Использование new для создания любого типа IQueryable, независимо от того, возможно ли это, далеко не продвинется.

При этом любой IEnumerable можно преобразовать в IQueryable с помощью метода расширения AsQueryable(). Это создает внешне похожую, но функционально очень конструкцию за кулисами, как при использовании методов LINQ против простого IEnumerable объекта. Это, вероятно, самый многочисленный источник запросов, к которому у вас есть доступ без настройки фактического поставщика IQueryable. Это изменение очень полезно для модульного тестирования алгоритмов на основе LINQ, поскольку вам не нужно фактическое хранилище данных, а только список данных в памяти, которые могут его имитировать.

person KeithS    schedule 07.02.2012
comment
Спасибо. Описанный вами сценарий (модульное тестирование) - это в значительной степени то, что я делаю. Знаете ли вы какую-либо хорошую документацию по указанным вами конструктивным различиям? Мне любопытно узнать больше о том, насколько объект отличается при использовании метода расширения AsQueryable(). - person one.beat.consumer; 07.02.2012
comment
Это ОЧЕНЬ другое. Вместо цепочки объектов Iterator, созданных методами IEnumerable Linq, методы IQueryable добавляют узлы в дерево выражений. Это дерево само по себе не является исполняемым кодом, как итератор. Но он является сериализуемым, анализируемым и т. Д., Поэтому вы можете определить структуру запроса и превратить его в запрос на другом языке, таком как SQL. - person KeithS; 07.02.2012
comment
Посмотрите на этот вопрос и все связанные ссылки: stackoverflow.com/questions/252785/ - person KeithS; 07.02.2012
comment
Думаю, вы помогли мне узнать здесь две вещи: stackoverflow.com/questions/9010384/. При использовании linq для объектов я работаю с цепочкой итераторов, тогда как с L2Sql или L2E дерево выражений, в конечном итоге преобразованное в SQL или какой-либо другой язык запросов, знает запрашиваемый провайдер? Я прилично понимаю? - person one.beat.consumer; 07.02.2012
comment
Да, у вас есть основная концепция. Продолжай читать; есть важные различия, которые бросаются в глаза у обоих, но основная суть заключается в том, что, хотя оба допускают ленивую оценку любой созданной вами конструкции, IEnumerable Linq предназначен для работы с ванильными коллекциями объектов в памяти, а IQueryable Linq предназначен для разговора с источники данных памяти. - person KeithS; 07.02.2012

Что ж, ваш вопрос немного странный ... но я верю, что если вы посмотрите на интерфейс в Reflector, он предоставит вам список разработчиков в загруженных сборках.

В качестве оговорки я не использовал Reflector, так как он был платным, поэтому я могу ошибаться.

person kprobst    schedule 07.02.2012

EntityCollection, как и EnumerableQuery.

Не то чтобы я думаю, что что-то из этого ни к чему вас приведет. Чтобы помочь, нам нужно знать, что вы действительно пытаетесь решить. Если вы пишете поставщика LINQ, вам следует прочитать следующее: http://msdn.microsoft.com/en-us/library/bb546158.aspx.

Они рекомендуют написать свою собственную реализацию.

person Chris Shain    schedule 07.02.2012
comment
Спасибо. Извините за путаницу в начальном посте; Я не ищу помощи с моим кодом, я просто изучаю новые объекты C # для игры. - person one.beat.consumer; 07.02.2012
comment
@AndreyTch, EntityCollection не ... DbQuery<T>, DbSet<T> и т. Д., Но я не уверен, что является общедоступным. - person nawfal; 06.12.2018