簡體   English   中英

使用數據填充分層類結構

[英]Filling a hierarchical class structure with data

我有一個像這樣的分層類結構:

類別 - >模板 - >實例

一個類別包含多個模板,一個模板包含多個實例。

如果我通過所有3個表的連接查詢數據庫中的數據,則數據如下所示:

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"

(只是一個例子,真正的數據表有更多的列)

在使用數據讀取器循環使用此類數據時,C#中最好/最常用的方法是什么?

從頭到尾我會這樣做:

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或Dictionaries?

注意:此問題與我關於從數據庫收集分層數據最佳方法的其他問題有關。 我把它分開是因為這是兩個不同的問題。

你做什么似乎是一種很好的工作方式。 只需確保對查詢中的數據和ID列進行排序。 按類別然后按模板排序。 這將確保您不會返回其中一個ID並再次創建對象。

此外 - 如果模板可以分為多個類別,則必須將每個模板存儲在某個列表中,以確保不會在類別上復制它們。

在從數據讀取器中讀取時,使用每行中的數據填充對象。 此時不要擔心重復:

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

以下內容將為您提供直接的課程方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM