我有一个像这样的分层类结构:
类别 -> 模板 -> 实例
一个类别包含多个模板,一个模板包含多个实例。
如果我通过连接所有 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 或字典?
注意:这个问题与我关于 best way to gather hierarchical data from a DB 的其他问题有关。我将其分开,因为这是两个不同的问题。
最佳答案
您所做的似乎是一种很好的工作方式。只需确保按您拥有的 ID 列对查询中的数据进行排序。按类别排序,然后按模板排序。这将确保您不会返回到其中一个 ID 并再次创建该对象。
另外 - 如果一个模板可以在多个类别中,您必须将每个模板存储在列表中的某处,以确保您不会在多个类别中重复它们。
关于c# - 用数据填充分层类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4564495/