У меня есть такая иерархическая структура классов:
Категория -> Шаблон -> Экземпляр
Категория содержит несколько шаблонов, шаблон содержит несколько экземпляров.
Если я запрашиваю данные из базы данных через объединить все 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 или словарей?
Примечание: этот вопрос связан с моим другим вопросом о наилучшем способе сбора иерархических данных из БД . Я разделил это, потому что это две разные проблемы.