Объясните маленькими словами, зачем нужен IQueryable <T> - PullRequest
3 голосов
/ 25 июня 2009

Это это ... Страница MSDN, интерфейс IQueryable (Of T) . Можете ли вы лучше объяснить, зачем нам нужен интерфейс маркера, который не добавляет никаких методов по сравнению с IEnumerable?

Ответы [ 4 ]

12 голосов
/ 25 июня 2009

IQueryable<T> также распространяется IQueryable. По сути это IQueryable, который можно перечислить строго типизированным способом. (И IQueryable, и IEnumerable<T> уже расширяют IEnumerable, так что на этом фронте ничего не добавляется.)

Теперь наличие строго типизированного IQueryable позволяет строго типизировать LINQ to SQL (и т. Д.) - в противном случае вы не можете писать предложения Where и т. Д. Без приведения. Фактические используемые методы LINQ относятся к типу Queryable, в значительной степени отражая методы Enumerable, но вместо делегатов принимают деревья выражений . (Если вы ранее не использовали деревья выражений, они в основном являются структурами данных , описывающими код, тогда как делегатом является сам код. Таким образом, вы можете выполнить делегат, но вы можете исследовать дерево выражений для посмотрим, что он будет делать.)

5 голосов
/ 25 июня 2009

IQueryable<T> необходим, поскольку он определяет контракт, необходимый для поставщика LINQ. Многие из методов расширения, доступных в IQueryable<T>, предназначены для принятия выражений, а не делегатов.

Это важно, поскольку поставщику LINQ нужно будет анализировать дерево выражений, а не вызывать делегат.

3 голосов
/ 25 июня 2009

Расширяется IEnumerable, IQueryable и IEnumerable<T>. У него могут не быть собственных методов, но он объединяет эти три других интерфейса в один, поэтому вам не нужно разбираться с ними по отдельности.

0 голосов
/ 25 июня 2009

Используйте IQueryable, если вы хотите преобразовать запрос linq в дерево выражений (System.Linq). Из дерева выражений вы можете легко перевести ваш запрос LINQ на другой язык (SQL для Linq To SQL. Другой классический пример - Linq to Google, где вы хотите этот запрос:

var searchResult = from result 
                   in Google.Repository 
                   where result.Equals("i love linq") 
                   select result;

Чтобы перевести на этот URL:

http://www.google.com/search?hl=en&q=i+love+linq&aq=f&oq=&aqi=g10

Затем вы анализируете страницу, чтобы получить результаты.

...