【问题标题】:Structuring an SQL-result into an envelope format将 SQL 结果结构化为信封格式
【发布时间】: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 完全正确。如果还有另一个加入任务,我也想显示这些数据集(递归)

标签: c# .net data-structures sqldatareader


【解决方案1】:

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

【讨论】:

  • 好主意,但是如果你有一个递归实体,这需要太多的请求......或者如果你有更多的连接......它可以工作,但我需要以某种方式处理分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2014-06-02
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多