【问题标题】:One to many database to json一对多数据库到 json
【发布时间】:2018-10-22 06:20:06
【问题描述】:

当我从一对多关系的数据库中检索数据时,我卡住了,我得到了两行这样的数据

ID   NAME   CHOICE_ID CHOICE_NAME CHOICE_VALUE
1     1         1          1          true
1     1         1          2          false

如何制作这样的json?

[{
    id:1
    name:1
    choice:[
          {
           choiceId:1
           choiceName:1
           choice_value:true
          },
          {
           choiceId:1
           choiceName:2
           choiceValue:false
           }
      ]
]}

我的代码是这样的:

 var tbl = from a in db.users
           join b in db.choice
           on a.choice_id = b.choice_id

           select new {
             a.id
             a.name
             a.choice_id
             b.choice_name
             b.choice_value
           }

        table.Select(p => new User()
        {
           id = p.id
           name = p.name
           choice = new List<Choice>()
           {
             new Choice()
             {
               choiceId = p.choiceId
               choiceName = p.choiceName
               choiceValue = p.choiceValue
             }
           }
        }).toList();

它会得到两个具有相同 id 和 name 我想得到一个包含所有选择的。

【问题讨论】:

  • 有些数据库可以自己返回json结构。您正在使用什么 rdbms? edit您的问题包括产品和特定版本标签。
  • c# api是什么关系?
  • 您可以将您的查询结果列表转换为json
  • 是的,但是如何修复结构?
  • 我可以为您提供一个使用 FOR JSON 的纯 t-sql 解决方案,它将直接从 SQL Server 返回 json 结构。你愿意吗?

标签: c# json sql-server-2017


【解决方案1】:

所以一个纯 T-SQL 解决方案应该是这样的:

SELECT Id, 
       Name,
       (
           SELECT choice_id, choice_Name, choice_Value
           FROM choice c
           WHERE c.choice_id = u.choice_id
           FOR JSON AUTO
        ) As choice
FROM users u
FOR JSON AUTO

【讨论】:

  • 我的问题是它在子查询中返回多个列然后它是错误的
  • 您没有在子查询中返回多个列,您正在返回一个包含 json 的值 - 您是否错过了子查询中的 FOR JSON AUTO
  • 为什么我不能在我的 sql server 中使用 FOR JSON AUTO?
  • 您是否收到错误消息? Json 支持是在 2016 版本中添加的,所以除非你的 compatibility level 设置低于 130,否则它应该是开箱即用的。
  • 哦,我使用的是旧笔记本电脑,它在 Windows 7 上运行并使用 Sql server 2012。感谢您回答我将在另一台计算机上尝试的问题。
【解决方案2】:

首先是查询。您需要在“分组依据”中工作,将 idname 上的实体分组,并在其下方放置子实体。

    var result = tbl
        .GroupBy(p => new { p.id, p.name })
        .Select(g => new
        {
           id = g.Key.id,
           name = g.Key.name,
           choice = g.Select(p => 
             new Choice()
             {
               choiceId = p.choiceId
               choiceName = p.choiceName
               choiceValue = p.choiceValue
             })
        }).toList();

其次,以 JSON 格式获取它取决于您使用的库。对于 C#,它可能是 .Net Web API 或 MVC。无论哪种方式,您都可以连接它以序列化其对 JSON 的响应,这是一个完全不同的问题。如果您想直接将其序列化为变量,我建议您使用Newtonsoft.Json,此时这将是一个非常简单的调用:

string json = JsonConvert.SerializeObject(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多