IQueryable <T>против IEnumerable <T>с лямбдой, какой выбрать? - PullRequest
8 голосов
/ 29 октября 2008

Я делаю все больше и больше упражнений с Lambda, но я не понимаю, почему иногда используют .AsQueryable();, которые используют IQueryable, а иногда пропускают .AsQueryable(); и используют IEnumerable.

Я прочитал MSDN , но я не вижу, как «выполнение дерева выражений» является преимуществом перед нет.

Кто-нибудь может мне это объяснить?

Ответы [ 3 ]

6 голосов
/ 03 ноября 2008

Как пользователь, вам, как правило, не нужно беспокоиться, это действительно связано с разработчиком источника данных. Если поставщики данных просто реализуют IEnumerable, вы в основном выполняете LINQ для выполнения объектов, то есть он выполняет операции с памятью для коллекций. IQueryable предоставляет источнику данных возможность преобразовывать дерево выражений в альтернативное представление для выполнения после выполнения выражения (обычно путем перечисления), что и делают Linq2Sql, Linq2Xml и Linq2Entities.

Единственный раз, когда я вижу заботу конечного пользователя, это если он хочет проверить дерево выражений, которое должно быть выполнено, так как IQueryable предоставляет выражение. Другое использование может быть проверка провайдера. Но оба эти сценария действительно должны быть зарезервированы для разработчиков других поставщиков запросов и хотят преобразовать выражение. Суть Linq в том, что вам не нужно заботиться о реализации исполнения выражения, которое будет использоваться.

6 голосов
/ 29 октября 2008

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

По сути, вам обычно не нужно заботиться о том или ином случае, если это IQueryable или IEnumerable.

1 голос
/ 20 мая 2009

Я согласен с Арне Клаассеном, есть случаи, когда вам нужно подумать о том, что лежит в основе данных источников. Например, проверьте это сообщение в блоге , которое показывает, как SQL, генерируемый IEnumerable и IQueryable, отличается в определенных сценариях.

...