Mysql
 sql >> Datenbank >  >> RDS >> Mysql

while on IDataReader.Read funktioniert nicht mit yield return, aber foreach on reader tut es

Es ist nicht while vs foreach das macht den Unterschied. Es ist der Aufruf von .Cast<T>() .

In der ersten Probe geben Sie auf dasselbe nach -Objekt in jeder Iteration der While-Schleife. Wenn Sie nicht aufpassen, haben Sie am Ende den yield-Iterator abgeschlossen, bevor Sie die Daten tatsächlich verwenden, und der DataReader wird bereits entsorgt. Dies kann passieren, wenn Sie beispielsweise .ToList() aufrufen nach Aufruf dieser Methode. Das Beste, worauf Sie hoffen können, wäre, dass jeder Datensatz in der Liste denselben Wert hat.
(Profi-Tipp:Meistens möchten Sie .ToList() bis es unbedingt sein muss. Es ist besser, nur mit IEnumerable Datensätzen zu arbeiten).

Im zweiten Beispiel, wenn Sie .Cast<T>() aufrufen Auf dem Datenleser erstellen Sie effektiv eine Kopie der Daten, während sie jeden Datensatz durchlaufen. Jetzt geben Sie nicht mehr dasselbe Objekt zurück.