Заполнение иерархической структуры классов данными

У меня есть такая иерархическая структура классов:

Категория -> Шаблон -> Экземпляр

Категория содержит несколько шаблонов, шаблон содержит несколько экземпляров.

Если я запрашиваю данные из базы данных через объединить все 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 или словарей?

Примечание: этот вопрос связан с моим другим вопросом о наилучшем способе сбора иерархических данных из БД . Я разделил это, потому что это две разные проблемы.

5
задан Community 23 May 2017 в 11:49
поделиться