Mysql
 sql >> Base de données >  >> RDS >> Mysql

tandis que sur IDataReader.Read ne fonctionne pas avec le retour de rendement mais foreach sur le lecteur le fait

Ce n'est pas while contre foreach ça fait la différence. C'est l'appel à .Cast<T>() .

Dans le premier échantillon, vous cédez sur le même objet à chaque itération de la boucle while. Si vous ne faites pas attention, vous finissez par avoir terminé l'itérateur de rendement avant d'utiliser réellement les données, et le DataReader sera déjà supprimé. Cela peut arriver si vous deviez, par exemple, appeler .ToList() après avoir appelé cette méthode. Le mieux que vous puissiez espérer serait que chaque enregistrement de la liste ait la même valeur.
(Conseil de pro :la plupart du temps, vous ne voulez pas appeler .ToList() jusqu'à ce que vous le deviez absolument. Il est préférable de travailler uniquement avec des enregistrements IEnumerable).

Dans le deuxième exemple, lorsque vous appelez .Cast<T>() sur le lecteur de données, vous effectuez effectivement une copie des données au fur et à mesure qu'elles parcourent chaque enregistrement. Maintenant, vous ne produisez plus le même objet.