使用数据填充分层类结构

mag*_*tic 5 .net c# linq database hierarchical-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"
Run Code Online (Sandbox Code Playgroud)

(只是一个例子,真正的数据表有更多的列)

在使用数据读取器循环使用此类数据时,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"]);
}
Run Code Online (Sandbox Code Playgroud)

是否有更好,更优雅的解决方案来填充分层类对象?也许使用LINQ或Dictionaries?

注意:此问题与我关于从数据库收集分层数据最佳方法的其他问题有关.我把它分开是因为这是两个不同的问题.

zsa*_*ank 3

你所做的似乎是一个很好的工作方式。只需确保按照您拥有的 ID 列对查询中的数据进行排序即可。按类别排序,然后按模板排序。这将确保您不会返回到这些 ID 之一并再次创建该对象。

另外 - 如果一个模板可以属于多个类别,则您必须将每个模板存储在列表中的某个位置,以确保不会在类别中重复它们。