将 SQL 结果结构化为信封格式

Posted

技术标签:

【中文标题】将 SQL 结果结构化为信封格式【英文标题】:Structuring an SQL-result into an envelope format 【发布时间】:2022-01-19 14:26:02 【问题描述】:

我在这里得到了类似这两张表的东西:

Id Name
198 Test-Project
227 Second test project

Id ProjectId Name
12 198 Task 1
23 198 Task 2
34 227 Task 1

这些将被映射到一个 sql 语句中,如下所示:

select project.Id, task.Id, task.ProjectId, task.Name, project.Name
from Project project 
left join Task task on project.Id = task.ProjectId 

返回这个:

Id Id ProjectId Name Name
198 23 198 Task 1 Test-Project
198 12 198 Task 2 Test-Project
227 34 227 Task 2 Second test project

现在,我想为此获得一个结构,例如 Entity Framework 会返回(我在 json 中显示以便更容易理解):


  "datasets": [
    
      "records": [
        
          "fields": [
            
              "Name": "Name",
              "Value": "Test-Project"
            ,
            
              "Name": "Id",
              "Value": 198
            
          ],
          "datasets": [
            
              "records": [
                
                  "fields": [
                    
                      "Name": "ProjectId",
                      "Value": 198
                    ,
                    
                      "Name": "Name",
                      "Value": "Task 1"
                    ,
                    
                      "Name": "Id",
                      "Value": 23
                    
                  ]
                
...

我尝试使用SqlDataReader,但我不知道如何将它们“分组”...我在逻辑部分失败了..

await using SqlCommand cmd = new SqlCommand(sql, connection).SetParameters(parameters);

connection.Open();

Root root = new ();
DataSet dataSet = new ();
await using (SqlDataReader reader = await cmd.ExecuteReaderAsync())

    while (reader.Read())
    
        Record record = new ();

        for (int i = 0; i < reader.FieldCount; i++)
        
            Field field = new ()
            
                Name = _getColumnName(i),
                Value = reader[i]
            ;

            record.DataFields.Add(field);
        

        dataSet.Records.Add(record);
    

root.DataAreas.Add(dataSet);

我唯一能得到的是一个包含所有数据集的平面列表:


  "datasets": [
    
      "records": [
        
          "fields": [
            
              "Name": "Id",
              "Value": 23
            ,
            
              "Name": "Name",
              "Value": "Task 1"
            ,
            
              "Name": "Name",
              "Value": "Test-Project"
            ,
            
              "Name": "Id",
              "Value": 198
            ,
            
              "Name": "ProjectId",
              "Value": 198
            
          ],
          "datasets": []
        

关于如何解决这个问题的任何想法?

【问题讨论】:

所以你想显示每个项目下的任务? @AndrewCorrigan 完全正确。如果还有另一个加入任务,我也想显示这些数据集(递归) 【参考方案1】:

你需要使用两个 SQL 命令 喜欢https://***.com/a/19448944/3409634 在第一个命令中读取父记录,在第二个命令中读取子对象并添加到父对象。

【讨论】:

好主意,但是如果你有一个递归实体,这需要太多的请求......或者如果你有更多的连接......它可以工作,但我需要以某种方式处理分组。

以上是关于将 SQL 结果结构化为信封格式的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 格式化为特定结构

将列表重新格式化为分组结构

您可以将旧版本的 xml 反序列化为更新的结构吗

数据结构与算法之深入解析“俄罗斯套娃信封问题”的求解思路与算法示例

将同步代码重新格式化为异步

如何将mysql表结构导出成Excel格式的