Полагаю, вы путаете IQueryable с IEnumerable. Да, это правда, что IQueryable можно рассматривать как IEnumerable, но это не совсем одно и то же. IQueryable запрашивает каждый раз, когда он используется, в то время как IEnumerable не имеет такого подразумеваемого повторного использования.
Запрос Linq возвращает IQueryable. ReadLines возвращает IEnumerable.
Здесь есть тонкое различие из-за способа создания Перечислителя. IQueryable создает IEnumerator, когда вы вызываете GetEnumerator () для него (что выполняется foreach автоматически). ReadLines () создает IEnumerator при вызове функции ReadLines (). Таким образом, когда вы повторно используете IQueryable, он создает новый IEnumerator при повторном его использовании, но поскольку ReadLines () создает IEnumerator (а не IQueryable), единственный способ получить новый IEnumerator - это снова вызвать ReadLines () .
Другими словами, вы можете рассчитывать только на повторное использование IQueryable, а не IEnumerator.
EDIT:
Что касается дальнейших размышлений (без каламбура), я думаю, что мой первоначальный ответ был слишком упрощенным. Если IEnumerable нельзя использовать повторно, вы не сможете сделать что-то вроде этого:
List<int> li = new List<int>() {1, 2, 3, 4};
IEnumerable<int> iei = li;
foreach (var i in iei) { Console.WriteLine(i); }
foreach (var i in iei) { Console.WriteLine(i); }
Очевидно, никто не ожидал, что второй foreach потерпит неудачу.
Проблема, как это часто бывает с подобными абстракциями, заключается в том, что не все идеально подходит. Например, потоки, как правило, односторонние, но для использования в сети их необходимо было адаптировать для работы в двух направлениях.
В этом случае IEnumerable изначально предполагалось использовать повторно, но с тех пор он был адаптирован так, чтобы повторное использование не было гарантией или даже ожидалось. Станьте свидетелем взрыва различных библиотек, использующих IEnumerables без возможности повторного использования, таких как библиотека Jeffery Richters PowerThreading.
Я просто не думаю, что мы можем предположить, что IEnumerables больше пригодны для использования во всех случаях.