Когда ожидать IEnumerable и когда ожидать IQueryable от запроса Linq - PullRequest
4 голосов
/ 28 сентября 2011

У меня возникают некоторые проблемы с пониманием, когда Linq дает мне IQueryable результат и когда он дает мне IEnumerable результат.

Пример:
Я использую EF, и у меня есть две сущности Location и Configuration. Каждый Location может иметь несколько Configurations.

Следующий запрос дает мне IQueryable как результат:

Context.Locations.Where(l => l.Name == "SomeName")

тогда как следующее дает мне IEnumerable как результат:

Context.Locations.Where(l => l.Name == "SomeName").First().Configurations.Select(c => c)

Почему это?

Ответы [ 2 ]

4 голосов
/ 28 сентября 2011

Как правило, методы расширения LINQ в IQueryable (определенные в Queryable ) возвращают IQueryables, а методы в IEnumerable (определенные в Enumerable ) возвращают IEnumerables.В этом конкретном случае Configurations является коллекцией (IEnumerable) первого возвращенного объекта Location.Поэтому вызов .Select возвращает IEnumerable.

РЕДАКТИРОВАТЬ: Чтобы все это выполнялось удаленно, вы можете попробовать это:

Context.Locations.Where(l => l.Name == "SomeName").Configurations

Предполагая, что ваш фильтр в Locations только собирается вернутьодин ряд, вы должны получить тот же результат.Конечно, это будет IQueryable, но это не должно иметь значения.Если вам нужно его материализовать, вы можете сделать что-то вроде:

Context.Locations.Where(l => l.Name == "SomeName").Configurations.ToList()
1 голос
/ 28 сентября 2011

По сути, IQueryable позволяет использовать удаленные источники данных (например, SQL Server).Это будет работать против базы данных, если это возможно.IEnumerable работает с коллекциями в памяти.

Таким образом, если вы запрашиваете базу данных SQL Server, вы получите IQueryable.В противном случае это будет IEnumerable.

Эта статья может помочь вам в дальнейшем.

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