2012-02-12 2 views

ответ

20

Вы были 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 для объектов.

+0

Не в моем случае, работающий счет на документе excel не очень хорош для производительности. 300-400 мс для около 350 рядов. Спасибо за ваше объяснение. Помог мне понять, почему это так медленно. –

0

Я не знаком с infeasability из IQueryable, но this blog post, кажется, указывает, что IQueryable гораздо предпочтительнее, поскольку IEnumerable IQueryable позволяет получить доступ к основной экспрессии.

Это может быть применимо только в случае предложения Where, а не для удара .Count().

Смежные вопросы