Existem dois problemas.
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
Quando o loop "Process Data" é atingido, a consulta pode não ser mais válida. Por exemplo, se a consulta estiver sendo executada em um DataContext que já foi Disposed, seu código emitirá uma exceção. Esse tipo de coisa se torna muito confusa quando você está processando uma consulta em um contexto diferente daquele em que a criou.
Um problema secundário é que sua conexão não será liberada até que o loop "Process Data" seja concluído. Isso é apenas um problema se "Process Data" for complexo. Isso é mencionado em http://msdn.microsoft.com/en-us/library/bb386929.aspx :
P. Por quanto tempo minha conexão com o banco de dados permanece aberta?
R. Uma conexão normalmente permanece aberta até você consumir os resultados da consulta. Se você espera levar algum tempo para processar todos os resultados e não se opõe ao armazenamento em cache, aplique ToList à consulta. Em cenários comuns em que cada objeto é processado apenas uma vez, o modelo de streaming é superior no DataReader e no LINQ to SQL.
Portanto, é por esses motivos que você está sendo incentivado a garantir que a consulta seja realmente executada, por exemplo, chamando ToList()
. No entanto, como Jimmy sugere , nada o impede de retornar sua lista como um IEnumerable.
Como regra geral, eu recomendo evitar a iteração sobre um IEnumerable mais de uma vez. Supondo que os consumidores do seu código sigam essa regra, não considero uma preocupação que alguém possa acessar o banco de dados duas vezes executando a consulta duas vezes.