Что такого особенного в IQueryable? - PullRequest
15 голосов
/ 21 апреля 2010

Я видел много людей, говорящих о IQueryable, и я не совсем понял, о чем идет речь. Я всегда работаю с универсальными List и нахожу их очень богатыми тем, как вы можете «запрашивать» их и работать с ними, даже запускать запросы LINQ к ним.

Мне интересно, есть ли веская причина начать рассматривать другую коллекцию по умолчанию в моих проектах.

Ответы [ 3 ]

45 голосов
/ 21 апреля 2010

Интерфейс IQueryable позволяет определять части запроса для удаленного поставщика LINQ (обычно для базы данных, но не обязательно) в несколько этапов и с отложенным выполнением.

например. Уровень вашей базы данных может определить некоторые ограничения (например, на основе разрешений, безопасности - чего угодно), добавив в ваш запрос предложение .Where(x => x.......). Но это еще не выполнено - например, вы не извлекаете 150 000 строк, соответствующих этому критерию.

Вместо этого вы передаете интерфейс IQueryable на следующий уровень, бизнес-уровень, где вы можете добавлять дополнительные требования и где к вашему запросу добавляются предложения - опять же, пока ничего не выполняется, вы также не бросаете 80 000 из 150 000 полученных вами строк - вы просто определяете дополнительные критерии запроса.

И слой пользовательского интерфейса может делать то же самое, например, основанный на пользовательском вводе в форме или чем-то.

Магия в том, что вы пропускаете интерфейс IQueryable через все слои, добавляя к нему дополнительные критерии - но он не будет выполнен / оценен, пока вы на самом деле не вызовете его. Это также означает, что вы не будете без необходимости отбирать и извлекать тонны данных, которые впоследствии будете отбрасывать.

Вы не можете сделать это с классическим статическим списком - вы должны выбрать данные, возможно, отбросив их снова позже в процессе - в конце концов, у вас есть статический список.

9 голосов
/ 21 апреля 2010

IQueryable позволяет вам делать запросы, используя LINQ, точно так же, как запросы LINQ to Object, где запросы фактически «компилируются» и выполняются в другом месте.

Наиболее распространенные реализации работают с базами данных. Если вы используете List<T> и LINQ to Objects, вы загружаете всю «таблицу» данных в память, а затем выполняете запрос к ней.

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

Это намного, намного эффективнее, особенно если вы работаете в системах N-Tiered.

5 голосов
/ 21 апреля 2010

LINQ-запросы к IEnumerable<T> создают делегаты (методы), которые при вызове выполняют описанный запрос.

LINQ-запросы к IQueryable<T> создают деревьев выражений , структуру данных, которая представляет код, который произвел запрос. Поставщики LINQ, такие как LINQ to SQL, интерпретируют эти структуры данных, создавая один и тот же запрос на целевой платформе (в данном случае T-SQL).

Пример того, как компилятор интерпретирует синтаксис запроса в отношении IQueryable<T>, см. В моем ответе на этот вопрос:

Построение динамических запросов LINQ на основе значения Combobox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...