Mysql
 sql >> Database >  >> RDS >> Mysql

mentre su IDataReader.Read non funziona con yield return ma foreach su reader lo fa

Non è while vs foreach questo fa la differenza. È la chiamata a .Cast<T>() .

Nel primo campione, stai cedendo allo uguale oggetto in ogni iterazione del ciclo while. Se non stai attento, finisci per aver completato l'iteratore di resa prima di utilizzare effettivamente i dati e DataReader sarà già eliminato. Questo può succedere se dovessi, ad esempio, chiamare .ToList() dopo aver chiamato questo metodo. Il meglio che puoi sperare sarebbe che ogni record nell'elenco abbia lo stesso valore.
(Suggerimento professionale:la maggior parte delle volte non vuoi chiamare .ToList() fino a quando non devi assolutamente. È meglio lavorare solo con i record IEnumerable).

Nel secondo esempio, quando chiami .Cast<T>() sul lettore di dati, stai effettivamente facendo una copia dei dati mentre scorre ogni record. Ora non stai più cedendo lo stesso oggetto.