No es while
frente a foreach
eso hace la diferencia. Es la llamada a .Cast<T>()
.
En la primera muestra, estás cediendo en el mismo objeto en cada iteración del ciclo while. Si no tiene cuidado, terminará habiendo completado el iterador de rendimiento antes de usar los datos y el DataReader ya se eliminará. Esto puede suceder si, por ejemplo, llamara a .ToList()
después de llamar a este método. Lo mejor que puede esperar es que todos los registros de la lista tengan el mismo valor.
(Consejo profesional:la mayoría de las veces no desea llamar a .ToList()
hasta que sea absolutamente necesario. Es mejor trabajar solo con registros IEnumerable).
En el segundo ejemplo, cuando llamas a .Cast<T>()
en el lector de datos, está haciendo efectivamente una copia de los datos a medida que itera a través de cada registro. Ahora ya no estás dando el mismo objeto.