시나리오 나는 데이터베이스를 통해 500 만 항목을 읽고 메모리에 컬렉션의 모든 저장하지 않고 하나씩 처리해야쿼리 결과를 메모리에 저장하지 않고 리포지토리를 구현하는 방법은 무엇입니까?
. (질문하여 LINQ, 그룹의 용도에 관한주의 등을 계산하십시오) 나를 명확히하기 위해 과도하게 단순화 C#을 영감 의사를 쓰자 -
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에를 사용하는 경우, 내가 돈 ' 메모리에 5 백만 개의 항목을 모두 저장해야합니다. 나는 그것들을 반복 할 수 있고 나의 메모리 요구 사항은 한 번에 한 행에 불과하다.
그러나 IEnumerable 등으로 저장소 패턴을 사용하면 처리하기 전에 메모리에 5 백만 개의 항목을 모두 저장해야합니다.
IEnumerable<...> tableData = repository.GetAll() // Here we loaded everything in the memory
foreach(var row in tableData)
//Do whatever...
내가 저장소 패턴을 건너 뛰고이 옛날 방식대로해야 - 코드는 같을 것이다? 아니면 메모리에 모든 것을로드하지 않고 리포지토리 패턴의 이점을 얻는 방법이 있습니까?
참고 : 내 마음이 repository.GetAggregatedResult (Func을 aggregateFunction) 을 만드는하지만 청소기 생각하지 않습니다에 제공되는 솔루션입니다. 게다가, 진짜 문제는 여기에있다 - 이 같은 방법을 구현할 수없는 이유
당신은 항상 매개 변수를 허용하고 특정 행 또는 행의 특정 번호를 선택 저장소를 작성할 수 있습니다. – Luke
오른쪽. 그러나 우리는 모든 행을 읽고 싶습니다. 각 행을 읽는 즉시 처리하고 메모리에 저장하는 대신 삭제합니다. – Achilles
_something_의 목록이있는 경우 행 목록이 메모리에 저장되지 않으므로 행 목록을 기대할 수 없습니다. 지능적으로로드하고 처리 한 다음로드해야합니다. 연결을 설정 한 다음 동일한 연결을 사용하여 더 많은 행을 요청하는 것이 잘못된 이유는 무엇입니까? – Luke