SzenarioWie Implementieren Repository, ohne Abfrageergebnisse im Arbeitsspeicher zu speichern?
Ich brauche mehr als 5 Millionen Artikel aus der Datenbank zu lesen und sie eins nach dem anderen, ohne speichern alle der Sammlung im Speicher zu verarbeiten. Lassen Sie mich einen vereinfachend C# inspiriert Pseudo-Code schreiben zu klären (bitte beachten Sie, dass die Frage über die Verwendungen von LINQ ist, Gruppe und zählen etc.) -
Lets say the table has the following fields - Id, Name, Age
IList<string> resultList = ...
IDataReader reader = command.executereader...
while(reader.Read()) //Read only one item at a time, no need to load everything
if (AggregateFunction(resultList, reader.Name, reader.Age))
resultList.Add(reader.Name);
Problem Wenn ich einen IDataReader verwenden, I don‘ Ich muss alle 5 Millionen Elemente im Speicher speichern. Ich kann einfach über sie hinwegschleifen und meine Speicheranforderung ist nur eine Reihe zu einer Zeit.
Aber wenn ich Repository-Muster mit IEnumerable etc. verwende, dann werde ich gezwungen sein, alle 5 Millionen Elemente im Speicher zu speichern, bevor ich sie verarbeiten kann. Der Code würde wie aussehen -
Soll ich Repository-Muster überspringen und tun dies nur auf die altmodische Art und Weise? Oder gibt es eine Möglichkeit, die Vorteile des Repository-Musters zu nutzen, ohne alles im Speicher zu laden?
Hinweis: Die Lösung, die mir in den Sinn kommt, ist ein Repository .GetAggregatedResult (Func AggregatFunction) , aber das fühlt sich nicht sauberer. Plus, hier ist das eigentliche Problem - wie auf Repository ein Element in einer Zeit zu durchlaufen, ohne das gesamte Ergebnis im Speicher gesetzt Speicherung
Sie können jederzeit Ihr Repository schreiben Parameter zu akzeptieren und nur bestimmte Zeilen oder bestimmte Anzahl von Zeilen auszuwählen. – Luke
Rechts. Aber wir wollen alle Zeilen lesen. Es ist nur so, dass wir jede Zeile verarbeiten wollen, sobald sie gelesen und dann gelöscht wird, anstatt sie im Speicher zu speichern. – Achilles
Sie können nicht erwarten, eine Liste von Zeilen zu haben und sie nicht im Speicher zu speichern, denn wenn Sie eine Liste von _etwas_ haben, ist es im Speicher. Sie müssen sie intelligent laden, verarbeiten und anschließend laden. Was ist beim Herstellen einer Verbindung falsch, und verwenden Sie dann dieselbe Verbindung, um weitere Zeilen anzufordern? – Luke