Hay dos problemas
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
En el momento en que se alcanza el ciclo "Datos de proceso", la consulta ya no es válida. Por ejemplo, si la consulta se ejecuta en un DataContext que ya se ha eliminado, su código arrojará una excepción. Este tipo de cosas se vuelve muy confuso cuando procesas una consulta en un contexto diferente al que la creaste.
Un problema secundario es que su conexión no se liberará hasta que se complete el ciclo "Datos de proceso". Esto es solo un problema si "Datos de proceso" es complejo. Esto se menciona en http://msdn.microsoft.com/en-us/library/bb386929.aspx :
P. ¿Cuánto tiempo permanece abierta la conexión de mi base de datos?
A. Una conexión generalmente permanece abierta hasta que consume los resultados de la consulta. Si espera tomarse el tiempo para procesar todos los resultados y no se opone al almacenamiento en caché de los resultados, aplique ToList a la consulta. En escenarios comunes donde cada objeto se procesa solo una vez, el modelo de transmisión es superior tanto en DataReader como en LINQ to SQL.
Por lo tanto, estos problemas son la razón por la que se le recomienda asegurarse de que la consulta se ejecute realmente, por ejemplo, llamando ToList()
. Sin embargo, como Jimmy sugiere, no hay nada que le impida devolver su Lista como IEnumerable.
Como regla general, recomiendo evitar iterar sobre un IEnumerable más de una vez. Suponiendo que los consumidores de su código sigan esta regla, no considero una preocupación que alguien pueda acceder a la base de datos dos veces ejecutando la consulta dos veces.