2010-12-30 2 views
5

과 계층 클래스 구조 작성 :나는이 같은 계층 클래스 구조가 데이터

카테고리 -> 템플릿 -> 인스턴스

카테 여러 템플릿이 포함되어이 템플릿은 여러 인스턴스를 포함합니다.

CategoryID | CategoryName | CategoryType | TemplateID | TemplateName | TemplateXYZ | InstanceID | InstanceName 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 1 | "InstA" 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 2 | "InstB" 
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 3 | "InstC" 
1 | "CatA" | "TypeX" | 1 | "TempB" | "Y" | 4 | "InstD" 

(단지 예를 들어, 실제 데이터 테이블이 더 많은 열이)

: 나는 3 개 테이블을 통해 참여를 통해 데이터베이스에서 데이터를 쿼리 할 경우

는 데이터는 다음과 같이 보입니다

데이터 판독기로 순환 할 때 이러한 종류의 데이터로 클래스를 채우는 가장 좋은 방법은 무엇입니까?

while(data.Read()) 
{ 
    // Create new objects each time the ID changes and read the data from the first row 
    if(data["CategoryID"] != lastCategoryID) { 
    lastCategoryID = data["CategoryID"]; 
    cat = new Category(data["CategoryName"], data["CategoryType"]); 
    catList.Add(cat); 
    } 
    if(data["TemplateID"] != lastTemplateID) { 
    lastTempateID = data["TemplateID"]; 
    template = new Template(data["TemplateName"], data["TemplateXYZ"])); 
    cat.Templates.Add(template); 
    } 
    template.Instances.Add(new Instance(data["InstanceID"], data["InstanceName"]); 
} 

이 계층 클래스 객체를 채우기 위해 더 나은, 더 우아한 해결책이 있습니까 : 나는 이런 식으로 할 것이 내 머리의 상단에서

? 어쩌면 LINQ 또는 사전을 사용하고 있을까요?

참고 :이 질문은 best way to gather hierarchical data from a DB에 대한 저의 다른 질문과 관련이 있습니다. 이것이 두 가지 분리 된 문제이기 때문에 나는 그것을 분리했다.

답변

3

당신이하는 일은 좋은 방법이라고 생각합니다. 쿼리의 데이터를 ID 열로 정렬해야합니다. 범주별로 정렬 한 다음 템플릿으로 정렬하십시오. 이렇게하면 해당 ID 중 하나로 돌아가서 개체를 다시 만들지 않습니다.

또한 템플릿이 여러 카테고리에 속할 수있는 경우 카테고리별로 템플릿을 복제하지 않도록 각 템플릿을 목록에 저장해야합니다. 다음과 같은

+0

감사합니다 그 점을 지적하기 위해 템플릿은 실제로 여러 범주에 속할 수 있습니다. 비록 내가 처음에는 많은 행에 대해서 동등한 데이터를 얻는 것에 대해서 여전히 불만 스럽긴하지만, 더 좋은 제안이 없다면, 나는 이것을 이렇게 구현할 것이라고 생각한다. – magnattic

-1

뭔가 클래스 접근 방식에 대한 직접적인을 제공합니다 :

하면 데이터 판독기에서 읽으면서
string[] allLines = File.ReadAllLines("datafile.dat"); 

var query = from line in allLines 
      let data = line.Split('|') 
      select Category 
       { 
        CategoryID = data[0], 
        CategoryName = data[1], 
        CategoryType = data[2], 
        Template = new Template { TemplateID = data[3], 
               TemplateXYZ = data[4], 
               Instance = new Instance { InstanceID = data[5], 
        InstanceName = data[6] } 
            } 
       }; 
+3

불쾌감은 없지만 질문을 읽었습니까? 나는 데이터베이스에서 데이터를 쿼리하고 대답은 계층 적 데이터 구조와 관련이 없다. – magnattic

+0

예 제가 읽었습니다. 그래서 여러분에게 구조를 가져 와서 객체에 넣는 해결책을 여러분에게주었습니다. 나는 당신의 Categories 객체와 반대로 새로운 것을 넣었다. 필자는 템플릿과 인스턴스 객체를 인라인으로 인스턴스화 할 수 있다는 것을 알고 있다고 가정 했으므로 원하는 계층 구조를 제공 할 수 있습니다. – phillip

+0

이제 게시를 업데이트하여 계층 구조 내에서 볼 수있게되었습니다.일반적으로 이런 종류의 코드를 작성할 때 나는 이와 같이 모든 것을 인라인하지 않습니다. 일반적으로 개별적으로 생성 한 다음 부모 개체에 자식 개체를 넣어 두지 만 단지 기본 설정 일뿐입니다. – phillip

1

, 각 행의 데이터와 객체를 채 웁니다. 이 시점에서 중복 대해 걱정하지 마십시오 :

var rawData = new List<Incoming>(); 
while (data.Read()) 
{ 
    rawData.Add(new Incoming(data[0], data[1],data[2],data[3],data[4],data[5],data[6],data[7])); 
} 

public class Incoming 
{ 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 
    public int CategoryType { get; set; } 
    public int TemplateID { get; set; } 
    public string TemplateName { get; set; } 
    public int TemplateXYZ { get; set; } 
    public int InstanceID { get; set; } 
    public string InstanceName { get; set; } 

    public Incoming(int categoryID , string categoryName , int categoryType , int templateId,string templateName ,int templateXYZ , int instanceID , string instanceName ) 
    { 
     CategoryID =categoryID; 
     CategoryName = categoryName; CategoryType = categoryType; TemplateID = templateId; 
     TemplateName = templateName; TemplateXYZ = templateXYZ; InstanceID = instanceID; InstanceName = instanceName; 
    } 
} 

다음 계층 구조의 개별 수준을 얻기 위해 LINQ를 사용할 수있는 곳 :

var categories = rawData.GroupBy (d => d.CategoryID );

관련 문제