C# IEnumerable <T> vs IQueryable <T>


#1

В чём состоит разница между возвратом IQueryable vs. IEnumerable?

IQueryable<Car> query1 = from car in db.Cars
                         where car.id > 3
                         select car;

IEnumerable<int> query2 = from car in db.Cars
                         where car.id > 3
                         select car;

#2

Разница в том, что IQueryable - это интерфейс, который позволяет реализовать запрос LINQ-to-SQL (LINQ.-to-anything). Поэтому, если вы уточните свой запрос на IQueryable, этот запрос будет выполнен в базе данных, если это возможно.

Для случая IEnumerable это будет LINQ-to-object, что означает, что все объекты, соответствующие исходному запросу, должны быть загружается в память из базы данных.

IQueryable<Car> query1 = from car in db.Cars
                         where car.id > 3
                         select car;

Этот код будет выполнять SQL для выбора только машин с id > 3. Следующий код, с другой стороны, выполнит исходный запрос в базе данных, а затем отфильтрует машины в памяти:

IEnumerable<int> query2 = from car in db.Cars
                         where car.id > 3
                         select car;

Это довольно важное различие, и работа над IQueryable может во многих случаях избавить вас от возврата слишком большого количества строк из базы данных.