Es gibt zwei Probleme.
IENumerable<Data> query = MyQuery();
//Later
foreach (Data item in query) {
//Process data
}
Wenn die "Process Data" -Schleife erreicht ist, ist die Abfrage möglicherweise nicht mehr gültig. Wenn die Abfrage beispielsweise für einen DataContext ausgeführt wird, der bereits freigegeben wurde, löst Ihr Code eine Ausnahme aus. Dies ist sehr verwirrend, wenn Sie eine Abfrage in einem anderen Kontext als dem, in dem Sie sie erstellt haben, verarbeiten.
Ein sekundäres Problem ist, dass Ihre Verbindung nicht freigegeben wird, bis die Schleife "Process Data" abgeschlossen ist. Dies ist nur dann ein Problem, wenn "Process Data" komplex ist. Dies wird unter http://msdn.microsoft.com/en-us/library/bb386929.aspx erwähnt :
F. Wie lange bleibt meine Datenbankverbindung offen?
A. Eine Verbindung bleibt normalerweise offen, bis Sie die Abfrageergebnisse verbrauchen. Wenden Sie ToList auf die Abfrage an, wenn Sie erwarten, dass Sie Zeit benötigen, um alle Ergebnisse zu verarbeiten, und wenn Sie nicht dagegen sind, die Ergebnisse zwischenzuspeichern. In gängigen Szenarien, in denen jedes Objekt nur einmal verarbeitet wird, ist das Streaming-Modell sowohl in DataReader als auch in LINQ to SQL überlegen.
Aus diesen Gründen sollten Sie sicherstellen, dass die Abfrage tatsächlich ausgeführt wird, z ToList()
. B. durch einen Anruf . Wie Jimmy vorschlägt, hindert Sie nichts daran, Ihre Liste als IEnumerable zurückzugeben.
Im Allgemeinen empfehle ich, das mehrmalige Durchlaufen eines IEnumerable zu vermeiden. Unter der Annahme, dass die Konsumenten Ihres Codes diese Regel befolgen, ist es meines Erachtens nicht bedenklich, dass jemand die Datenbank zweimal durch zweimaliges Ausführen der Abfrage erreicht.