【问题标题】:Converting SQL datatable results into a JSON Object when using LEFT JOIN使用 LEFT JOIN 时将 SQL 数据表结果转换为 JSON 对象
【发布时间】:2017-09-06 19:46:44
【问题描述】:

我能否请教一些关于如何实现以下目标的指导:

我有两张桌子。表1和表2。

表1:

id  | Link    | Date
123 | Example | 01/01/2017

表2:

id  | Description              | Name | Email
123 | Example edges on corners | Jim  | Jim@example.com
123 | damage to corner         | Fred | Fred@example,com

我正在使用 SQL 语句将表 2 连接到表 1。然后将结果转换为 JSON 对象。

C# 代码

DataTable dt = new DataTable();
using (SqlCommand cmd = new SqlCommand("SELECT Table1.ID, Table1.Link, Table1.Date, Table2.Description, Table2.Name, Table2.Email FROM Table1 LEFT JOIN Table2 ON Table1.ID = Table2.ID", con))
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                foreach (DataRow dr in dt.Rows)
                {
                    row = new Dictionary<string, object>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        if (col.ColumnName == "Link")
                        {
                            string escapeChar = dr[col].ToString().Replace(@"\", @"");
                            row.Add(col.ColumnName, escapeChar);
                        }
                        else if (col.ColumnName == "Date")
                        {
                            DateTime formatDate = DateTime.Parse(dr[col].ToString());
                            row.Add(col.ColumnName, formatDate.ToString("dd/MM/yyyy"));
                        }

                        else
                        {
                            row.Add(col.ColumnName, dr[col]);
                        }

                    }
                    rows.Add(row);
                }
                return serializer.Serialize(rows);
            }
        } 

结果是:

[
  {
    "ID": "123",
    "Link": "example",
    "Date":"01/01/2017",
    "Description": "round edges on corners",
    "Name": "Jim",
    "Email": "Jim@example.com"
  },
  {
    "ID": "123",
    "Link": "example",
    "Date":"01/01/2017",
    "Description": "damage to corner",
    "Name": "Fred",
    "Email": "Fred@example,com"
  }
]

我需要的是:

[
  {
    "ID": "123",
    "Link": "example",
    "Date": "01\/01\/2017",
    "Descriptions": [
      {
        "Description": "round edges on corners",
        "Name": "Jim",
        "Email": "Jim@example.com"
      },
      {
        "Description": "round edges on corners ",
        "Name": "Fred",
        "Email": " Fred @example.com"
      }
    ]
  }
]

表 2 中基本上有两个条目,表 1 中的 ID 为 123。我怎样才能达到上述结果?提前谢谢你。

【问题讨论】:

  • 请标记您的 DBMS。
  • JavaScriptSerializer 没有给您太多控制权。我建议使用 JSON.NET 和 LINQ to JSON 来允许您直接生成所需的特定 JSON(序列化器使简单的案例变得容易,但如果您需要特定格式,它们比自己做的要多得多)。
  • 感谢您提供的链接,我会尝试这种方法

标签: c# json sql-server-2012


【解决方案1】:

您可以使用 SQL Server 2016+ JSON 功能

SELECT Table1.ID, Table1.Link, Table1.Date, 
  (
     SELECT Table2.Description, Table2.Name, Table2.Email 
     FROM Table2
     WHERE Table1.ID = Table2.ID 
     FOR json auto
  ) as 'Descriptions' 
FROM Table1
GROUP BY Table1.ID, Table1.Link, Table1.Date
FOR json auto

【讨论】:

  • 感谢您的回复,这是要替换当前的 select 语句吗?
  • @user3515765 完全正确,它应该以您在问题中描述的 JSON 格式返回结果。
  • 我收到此代码的错误 System.Data.SqlClient.SqlException: 'json' 附近的语法不正确。
  • @user3515765 您使用的是什么 DBMS? JSON 自 2016 年起在 SQL Server 中可用。
  • 我使用的 MSMS 2016 服务器是 2012。它不喜欢 'json auto'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多