2016-02-21 9 views
4

Я не уверен, что понимаю, что именно IQueryable есть.Что именно означает IQueryable?

Я понимаю, что он не получает меня всех сущностей и помещает часть ограничения в память, но выполняет ее как часть команды, которую он отправляет в базу данных.

Пожалуйста, исправьте меня, если я ошибаюсь и скажу, почему мои функции репозитория возвращают IQueryable, а не просто List?

ответ

16

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

Преимущество возврата IQueryable из вашего репозитория в том, что ваш код вызова может указывать дополнительные предложения .Where ПЕРЕД запросом в базу данных. Если вы вернете IEnumerable, ваш код будет извлекать все значения одной таблицы из базы данных, а затем выполнять фильтрацию в памяти, что является неэффективным.

+0

Вы бы хорошо рассказали об опасностях возвращения IQueryable. Вы действительно не хотите передавать контроль над тем, какой запрос будет сгенерирован для других слоев. Особенно, если вы собираетесь разоблачить его с помощью OData. –

6

IQueryable и IQueryable<T> - абстракции, которые инкапсулируют выражения LINQ; эти выражения затем используются поставщиком LINQ - как и тот, который используется Entity Framework, - чтобы превратить эти выражения в SQL, который, в свою очередь, будет отправлен в базу данных. Различные поставщики LINQ интерпретируют выражения LINQ по-разному, например, MongoDB превращает эти выражения в запросы JSON.

IQueryable с вычисляются только тогда, когда метод «терминал», называется на них, как, ToList(), ToArray(), Single(), SingleOrDefault(), First(), FirstOrDefault(), Count(), Any() и т.д. Это когда провайдер Quicks в и делает перевод. Microsoft включает поставщика LINQ, который не выполняет перевод ни на что, но работает в памяти. Это тот, который используется, когда вы поворачиваете IEnumerable<T> в IQueryable<T>, вызывая метод расширения AsQueryable().

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