c# - 用数据填充分层类结构

标签 c# .net database linq 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"

(只是举个例子,真实数据表的列要多很多)

在使用数据读取器循环遍历类时,在 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/

相关文章:

sql - 需要建议以根据审计表重新创建表的历史记录

c# - 如何使用 WinForms 中的 Web 浏览器控件访问 HTML 文档的 <HEAD> 元素?

c# - 将 Zip 文件作为流写入 AWS

c# - 如何使用 WebRequest 发布数据并从网页获取响应

c# - 如何在 Linux 上的 VSCode 中安装和使用 Winforms?

.net - IDynamicMetaObjectProvider 最简单的实现是什么?

android - SQLite 数据库 - 只创建了一个表

mysql - 是否可以通过在 SQL 和 mySql 中具有数据库的内部连接从不同的数据库获取信息?

c# - 无法加载/usr/bin/dotnet : exec format error

c# - 如何将 RoutePattern 添加到 Endpoint 对象