СценарийКак реализовать репозиторий без сохранения результатов запроса в памяти?
мне нужно прочитать более 5 миллионов элементов из базы данных и обрабатывать их один за другим, без необходимости хранить все коллекции в памяти. Позволь мне писать упрощенно C# вдохновили псевдокод для уточнения (обратите внимание, что речь идет о использованиях LINQ, групп по и сосчитать и т.д.) -
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);
Проблема Если я использую IDataReader, я не» t должен хранить все 5 миллионов элементов в памяти. Я могу просто зациклиться на них, и моя потребность в памяти - всего одна строка за раз.
Но если я использую шаблон репозитория с IEnumerable и т. Д., Тогда я буду вынужден хранить все 5 миллионов элементов в памяти, прежде чем я смогу их обработать. Код будет выглядеть так:
IEnumerable<...> tableData = repository.GetAll() // Here we loaded everything in the memory
foreach(var row in tableData)
//Do whatever...
Должен ли я пропустить шаблон хранилища и сделать это по-старому? Или есть способ получить преимущества шаблона Репозитория, не загружая все в память?
Примечание: Решение, которое приходит мне на ум, создает репозиторий .GetAggregatedResult (Func aggregateFunction) , но это не чувствует себя чище. Кроме того, реальная проблема здесь - как перебираются на хранилище одного пункта в то время, не сохраняя весь набор результатов в памяти
Вы всегда можете написать свой репозиторий, чтобы принять параметры и выбрать только определенные строки или определенное количество строк. – Luke
Справа. Но мы хотим прочитать все строки. Просто мы хотим обработать каждую строку, как только она будет прочитана, а затем отбросьте вместо сохранения в памяти. – Achilles
Вы не можете ожидать наличия списка строк и не хранить их в памяти, потому что, если у вас есть список _something_, он находится в памяти. Вы должны разумно загружать их, обрабатывать их, а затем загружать еще несколько. Что случилось с установкой соединения, а затем с использованием того же соединения для запроса большего количества строк? – Luke