Возвращая IEnumerable < T > против IQueryable < T >

Почему мы вызываем метод start(), который в свою очередь вызывает метод run()?

Нет, это неточно. start() в свою очередь не вызывает метод run. вместо этого он запускает поток, который выполняет метод run.

Не можем ли мы напрямую позвонить run()?

Если вы вызываете run() прямо, вы не запускаете поток, вы просто выполняете метод по одному и тому же методу вызова.

Просьба привести пример, где есть разница.

Есть миллионы на веб. Поэтому я не дублирую.

1023
задан Peter Mortensen 14 September 2016 в 21:53
поделиться

2 ответа

Да, оба предоставят вам отложенное выполнение .

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

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

В коде:

IQueryable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);

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

IEnumerable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);

Это довольно важное различие, и он работает с IQueryable во многих случаях может спасти вас от возврата слишком большого количества строк из базы данных.Другой яркий пример - разбиение на страницы: если вы используете Take и Skip в IQueryable , вы получите только количество запрошенных строк; выполнение этого в IEnumerable приведет к загрузке всех ваших строк в память.

1740
ответ дан 19 December 2019 в 20:19
поделиться

Оба дадут вам отсроченную казнь, да.

Что предпочтительнее другого, это зависит от вашего базового источника данных.

Возврат IEnumerable автоматически заставит среду выполнения использовать LINQ to Objects для запроса вашей коллекции.

Возврат IQueryable (который, кстати, реализует IEnumerable ) предоставляет дополнительную функциональность для преобразования вашего запроса во что-то, что могло бы лучше работать с базовым источником (LINQ to SQL, LINQ to XML и т. Д.).

56
ответ дан 19 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: