sql >> Database >  >> RDS >> Mysql

terwijl op IDataReader.Read werkt niet met opbrengstrendement, maar foreach op lezer wel

Het is niet while vs foreach dat maakt het verschil. Het is de aanroep van .Cast<T>() .

In het eerste voorbeeld levert u op voor dezelfde object in elke iteratie van de while-lus. Als u niet oppast, heeft u uiteindelijk de opbrengstiterator voltooid voordat u de gegevens daadwerkelijk gebruikt, en is de DataReader al verwijderd. Dit kan gebeuren als u bijvoorbeeld .ToList() . zou aanroepen na het aanroepen van deze methode. Het beste waar je op kunt hopen, is dat elk record in de lijst dezelfde waarde heeft.
(Pro-tip:meestal wil je .ToList() totdat het absoluut moet. Het is beter om gewoon met IEnumerable records te werken).

In het tweede voorbeeld, wanneer u .Cast<T>() . aanroept op de datareader maakt u in feite een kopie van de gegevens terwijl deze door elk record worden herhaald. Nu levert u niet langer hetzelfde object op.



  1. Preventie van SQL-injectie

  2. PostgreSQL:namen van standaardbeperkingen

  3. Microsoft SQL Server – Doe mee met SQL Saturday Dallas

  4. kan geen automatisch oplopende primaire sleutel maken met flask-sqlalchemy