Какие типы экземпляров с возможностью реализации IQueryable <T>доступны в .Net 4.0? - PullRequest
36 голосов
/ 07 февраля 2012

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

Ответы [ 3 ]

56 голосов
/ 07 февраля 2012

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

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

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

3 голосов
/ 07 февраля 2012

EntityCollection делает, как и EnumerableQuery .

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

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

3 голосов
/ 07 февраля 2012

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

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

...