Я работаю впервые с Entity Framework в .NET и пишу LINQ-запросы, чтобы получить информацию от моей модели. Я хотел бы с самого начала программировать в хороших привычках, поэтому я проводил исследования по наилучшему способу писать эти запросы и получать их результаты. К сожалению, при просмотре Stack Exchange я, похоже, столкнулся с двумя противоречивыми объяснениями того, как отложенное/немедленное выполнение работает с LINQ:
- Функция foreach заставляет запрос выполняться на каждой итерации цикла:
Продемонстрирован вопрос Slow foreach() в запросе LINQ - ToList() значительно повышает производительность - почему это?, подразумевается, что "ToList()" необходимо вызвать для немедленной оценки запроса, поскольку foreach повторно обрабатывает запрос в источнике данных, значительно замедляя работу.
Другим примером является вопрос Представление через сгруппированные результаты linq невероятно медленно, любые советы?, где принятый ответ также подразумевает, что вызов "ToList()" на запрос улучшит производительность.
- Функция foreach заставляет запрос выполняться один раз и безопасен для использования с LINQ
Демонстрируется вопрос Выполняет ли foreach запрос только один раз?, подразумевается, что foreach заставляет одно перечисление быть установленным и не будет запрашивать источник данных каждый раз.
Продолжение просмотра сайта вызвало множество вопросов, когда "повторное выполнение во время цикла foreach" является виновником проблемы производительности, и множество других ответов, в которых говорится, что foreach будет соответствующим образом захватывать один запрос из источника данных, который означает, что оба объяснения, похоже, имеют силу. Если гипотеза "ToList()" неверна (как и большинство текущих ответов на 2013-06-05 13:51 PM EST, похоже, подразумевает), откуда это заблуждение? Есть ли одно из этих объяснений, которое является точным, а другое - нет или существуют разные обстоятельства, которые могут вызвать запрос LINQ по-другому?
Изменить: В дополнение к принятому ниже ответу, я включил следующий вопрос в отношении Programmers, который очень помог мне понять выполнение запроса, в частности, подводные камни, которые могут привести к множественным ударам данных в течение цикл, который, я думаю, будет полезен другим заинтересованным в этом вопросе: https://softwareengineering.stackexchange.com/info/178218/for-vs-foreach-vs-linq