Вы были misinformed.
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();
Все экземпляры Люди будут материализовался в памяти один за другим, в то время как Linq к объектам переборе коллекции, чтобы определить количество. Это будет очень медленно, и его следует избегать, когда это возможно.
Поскольку не все вызовы метода могут быть сопоставлены с запросами к базам данных это иногда неизбежно использовать IEnumerable
, но все фильтрации, объединения и группировки должны быть сделаны на IQueryable, если это возможно, то в качестве последнего шага вы можете использовать AsEnumerable()
методы расширения для переключения на использование IEnumerable
и Linq для объектов.
Не в моем случае, работающий счет на документе excel не очень хорош для производительности. 300-400 мс для около 350 рядов. Спасибо за ваше объяснение. Помог мне понять, почему это так медленно. –