2010-12-30 27 views
5

Tôi có một cấu trúc lớp thứ bậc như thế này:Điền một cấu trúc lớp thứ bậc với các dữ liệu

loại -> Template -> Instance

Một loại chứa nhiều mẫu, một mẫu có chứa nhiều trường hợp.

Nếu tôi truy vấn dữ liệu từ cơ sở dữ liệu thông qua một tham gia trên khắp 3 bảng, dữ liệu trông giống như sau:

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" 

(chỉ là ví dụ, các bảng dữ liệu thực tế có cột nhiều hơn nữa)

Cách tốt nhất/phổ biến trong C# để điền vào các lớp với loại dữ liệu này khi đi xe đạp qua nó với trình đọc dữ liệu là gì?

Từ đỉnh đầu của tôi, tôi sẽ làm điều đó theo cách này:

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"]); 
} 

Có một giải pháp thanh lịch hơn tốt hơn để điền vào các đối tượng lớp thứ bậc? Có thể sử dụng LINQ hoặc Từ điển?

Lưu ý: Câu hỏi này liên quan đến câu hỏi khác của tôi về số best way to gather hierarchical data from a DB. Tôi chia nó ra vì đây là hai vấn đề riêng biệt.

Trả lời

3

Điều bạn làm dường như là một cách hay để làm việc đó. Chỉ cần đảm bảo bạn sắp xếp dữ liệu trong truy vấn của mình và cột ID bạn có. Sắp xếp theo danh mục rồi chọn mẫu. Điều này sẽ đảm bảo bạn không quay lại một trong các ID đó và tạo lại đối tượng.

Ngoài ra - nếu một mẫu có thể có nhiều danh mục, bạn sẽ phải lưu trữ từng mẫu trong danh sách ở đâu đó để đảm bảo bạn không sao chép chúng trên các danh mục.

+0

Cảm ơn để chỉ ra rằng, một mẫu thực sự có thể có nhiều danh mục. Mặc dù tôi vẫn không hài lòng với việc nhận dữ liệu ngang bằng với nhiều hàng chỉ từ hàng đầu tiên, tôi đoán tôi sẽ thực hiện nó theo cách này, nếu không có gợi ý nào tốt hơn. – magnattic

-1

Cái gì đó như sau đây sẽ cung cấp cho bạn với một cách tiếp cận trực tiếp đến lớp:

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

Không phạm tội, nhưng bạn có đọc được câu hỏi không? Tôi truy vấn dữ liệu từ một cơ sở dữ liệu và câu trả lời của bạn thậm chí không có bất cứ điều gì để làm với cấu trúc dữ liệu phân cấp. – magnattic

+0

Có tôi đọc nó và đó là lý do tại sao tôi đã cho bạn một giải pháp mà có cấu trúc của bạn và đặt nó vào một đối tượng. Tôi đặt mới như trái ngược với đối tượng thể loại của bạn. Tôi giả sử bạn biết rằng bạn có thể sau đó nhanh chóng mẫu của bạn và đối tượng dụ nội tuyến cũng sẽ cung cấp cho bạn thứ bậc bạn muốn. – phillip

+0

Bây giờ tôi đã cập nhật bài đăng để bạn có thể thấy nó trong một hệ thống phân cấp.Thông thường khi tôi viết loại mã này, tôi không đặt tất cả nội tuyến như thế này - tôi thường tạo chúng riêng lẻ và sau đó ghép các đối tượng con vào cha mẹ của chúng nhưng đó chỉ là một sở thích. – phillip

1

Khi bạn đọc từ đầu đọc dữ liệu, cư một đối tượng với các dữ liệu từ mỗi hàng. Tại thời điểm này, đừng lo lắng về những trùng lặp:

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])); 
} 

nơi

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; 
    } 
} 

sau đó bạn có thể sử dụng LINQ để có được mức độ cá nhân của hệ thống phân cấp ra:

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

Các vấn đề liên quan