Вы были дезинформированы.
IEnumerable
будет использовать Linq для объектов, все методы выполняются для объектов в памяти .- IQueryable
будет использовать любую реализацию методов расширения Linq, предоставленную конкретным поставщиком.В этом случае (хранилище), я думаю, это, скорее всего, поставщик, который отображает выражения Linq в операторы базы данных.
Это означает, что если вы используете IQueryable
:
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
Количество определяется в самой базе данных, то есть как запрос "select count(*) from People"
.Это обычно очень, очень быстро.
Если вы используете IEnumerable
:
IEnumerable<People> list = repository.FindAllPeople;
int count = list.Count();
Все экземпляры People будут материализованы в память один за другим, в то время как Linq для объектов перебирает коллекциюопределить количество.Это будет очень медленно, и его следует избегать всякий раз, когда это возможно.
Поскольку не все вызовы методов могут быть сопоставлены с запросами к базе данных, иногда неизбежно использовать IEnumerable
, но вся фильтрация, объединение и группировка должны выполнятьсяна IQueryable, если это возможно, затем в качестве последнего шага вы можете использовать методы расширения AsEnumerable()
для переключения на использование IEnumerable
и Linq для объектов.