Почему использование Count с IQueryable считается невозможным - PullRequest
10 голосов
/ 12 февраля 2012

Если у меня есть следующий код: -

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 

Тогда считается ли это невозможным для подсчета объектов IQueryable и лучше использовать IEnumerable?BR

Ответы [ 2 ]

20 голосов
/ 12 февраля 2012

Вы были дезинформированы.

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

0 голосов
/ 12 февраля 2012

Я не знаком с неосуществимостью IQueryable, но это сообщение в блоге , кажется, указывает, что IQueryable намного предпочтительнее IEnumerable, потому что IQueryable разрешает доступ к базовому выражению.

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

...