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?
注意:此问题与我关于从数据库收集分层数据的最佳方法的其他问题有关.我把它分开是因为这是两个不同的问题.
你所做的似乎是一个很好的工作方式。只需确保按照您拥有的 ID 列对查询中的数据进行排序即可。按类别排序,然后按模板排序。这将确保您不会返回到这些 ID 之一并再次创建该对象。
另外 - 如果一个模板可以属于多个类别,则您必须将每个模板存储在列表中的某个位置,以确保不会在类别中重复它们。