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()
.
Вы бы хорошо рассказали об опасностях возвращения IQueryable. Вы действительно не хотите передавать контроль над тем, какой запрос будет сгенерирован для других слоев. Особенно, если вы собираетесь разоблачить его с помощью OData. –