Если у меня есть следующий код: -
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
Тогда считается ли невозможным считать объекты IQueryable, и лучше использовать IEnumerable? BR
Если у меня есть следующий код: -
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
Тогда считается ли невозможным считать объекты IQueryable, и лучше использовать IEnumerable? BR
Вы были дезинформированы.
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 для объектов.
Я не знаком с неосуществимостью IQueryable, но этот пост в блоге, похоже, указывает на то, что IQueryable гораздо предпочтительнее IEnumerable, потому что IQueryable позволяет получить доступ к основному выражению.
Это может быть актуальным только в случае предложения Where и не влияет на .Count().