2010-12-08 3 views
2

각 레코드에 6 개의 하위 엔티티 목록이있는 약 7500 개의 데이터베이스 레코드를 가져와야하는 시나리오가 있습니다. 각 자식 목록은 0 ~ 약 125 개의 레코드가 될 수 있습니다. 나는 모든 개체를 검색 한 후수십만 개의 하위 레코드가있는 수천 개의 레코드를 클래스 객체로 가져 오는 가장 효과적인 방법은 무엇입니까?

public class Entity 
{ 
    public int ID { get; set; 
    public string Name { get; set; } 
    public ICollection<ChildEntity1> Children1 { get; set; } 
    public ICollection<ChildEntity2> Children2 { get; set; } 
    public ICollection<ChildEntity3> Children3 { get; set; } 
    public ICollection<ChildEntity4> Children4 { get; set; } 
    ... 2 more collections 
} 

것은, 내가 궁극적으로 각각의 반복과 약간의 계산을 수행, 일부 웹 서비스 및 기타 여러 가지를 호출해야합니다

내 계급 구조의 종류 다음과 같습니다 파일로 내 보냅니다.

C# 4를 사용하여 MS SQL Server 2008에서이 데이터를 검색하는 가장 좋은 전략은 무엇입니까? DataAdapters가있는 DataSet이 가장 좋은 방법입니까? ORM?

분명히 N + 1 개의 선택 시나리오에서 벗어나고 싶습니다.

+1

메모리에있는 모든 엔티티가 동시에 필요합니까, 아니면 엔티티의 하위 집합을 가져 와서 처리하고 파일에 쓸 수 있습니까? –

+0

하나의 전략은 "모든 항목 검색"다음에 "각 항목 반복"을 수행해서는 안됩니다. 한 번에 한 행씩 알고리즘을 사용할 수없는 이유가 있습니까? –

+0

@ Gilbert- 한 번에 100 개씩 하위 집합을 가져와 처리하고 마지막에 내보낼 목록에 추가 할 수 있습니다. 자식이있는 상위 엔터티는 완전히 원자 적입니다. –

답변

0

그래서 나는 다음 중첩 된 DataReader가, 부모 모두를 얻을 수있는 부모 개체에 대한 하나의 외부 다른 하나는 판독기를 사용하여 하나 개의 문장에서 아이들을 모두 읽고 하나의 내부를 가졌다하고 결국 무엇을 이와 유사한 .NextResult() 메소드 :

var exampleSql = "select * from child1Table; " + 
       "select * from child2Table; " + 
       "select * from child3Table"; 
       // and so on for the other child tables 
using (var outerReader = cmd.ExecuteReader()) 
{ 
    while (outerReader.Read()) 
    { 
     var entity = new Entity(); 
     entity.Prop1 = outerReader[0]; 
     entity.Prop2 = outerReader[1]; 
     //.... etc. 

     using (var cmdInner = new SqlCommand(exampleSql)) 
     using (var innerReader = cmdInner.ExecuteReader()) 
     { 
      while (innerReader.Read()) 
      { 
       var child = new Child1(); 
       child.Prop1 = innerReader[0]; 
       // ... etc. 
       entity.Children1.Add(child); 
      } 
      innerReader.NextResult(); 
      while (innerReader.Read()) 
      { 
       var child = new Child2(); 
       child.Prop1 = innerReader[0]; 
       // ... etc. 
       entity.Children2.Add(child); 
      } 
      innerReader.NextResult(); 
      // and so on for the other child entities 
     } 
    } 
} 

는 적어도 이런 식으로, 난 단지 부모 당 자녀마다 별도의 문 대신 부모 당 내 아이 엔티티를 모두 검색하기 위해 데이터베이스에 하나의 SQL 문을 보내고있다 .

더 좋은 방법이 있다면 으로 알려주세요.

Btw, 내 예제 코드는 단지 의사 코드입니다. 사실 매개 변수화 된 쿼리를 사용하고 선택 항목이 없으며 필요한 열만 있습니다. 의도는 실제 구현이 아닌 접근 방식을 보여주는 것입니다.

0
DECLARE CURSOR on the Entity. 

OPEN CURSOR. 

For each FETCH CURSOR 

    SELECT the child rows for the current Entity. 

    Write the output. 

CLOSE CURSOR. 
관련 문제