Ответ 1
IQueryable
объекты создаются Queryable Providers (например, LINQ to SQL, LINQ to Entities/Entity Framework и т.д.). Практически ничего, что можно создать с помощью new
в базовой .NET Framework, реализует IQueryable.
IQueryable
- это интерфейс, предназначенный для создания поставщиков Queryable, которые позволяют использовать библиотеку LINQ против внешнего хранилища данных путем создания дерева синтаксического анализа. По своей природе Queryables требует контекста - информацию о том, что именно вы запрашиваете. Используя new
для создания любого типа IQueryable, независимо от того, возможно ли это, вы не очень далеко.
При этом любой IEnumerable
можно преобразовать в IQueryable
с помощью метода расширения AsQueryable()
. Это создает поверхностно-подобную, но функционально совершенно другую конструкцию за кулисами, как при использовании методов LINQ для простого объекта IEnumerable
. Это, вероятно, самый богатый источник запросов, к которым у вас есть доступ, без создания реального поставщика IQueryable. Это изменение очень полезно для модульных тестов LINQ-алгоритмов, поскольку вам не нужен фактический магазин данных, а просто список данных в памяти, которые могут имитировать его.