将 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 结果结构化为信封格式的主要内容,如果未能解决你的问题,请参考以下文章