我有一個包含兩列的表,我試圖將查詢轉換為具有鍵值對的物件,以將其保存到 c# 中的字典中。
C# 代碼將 Json 物件轉換為字典
string JsonDictionary;
JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonDictionary);
我在 sql server 中的表:

我的查詢:
SELECT
C.[Key]
,C.[Value]
FROM dbo.Settings C
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
輸出查詢:
{
"Key": "userName",
"Value": "userNameValue"
},
{
"Key": "password",
"Value": "passwordValue"
},
{
"Key": "domain",
"Value": "domainValue"
}
預期輸出:
{
"userName": "userNameValue",
"password": "passwordValue",
"domain": "domainValue"
}
我已經搜索過但找不到解決方案
uj5u.com熱心網友回復:
SQL Server 不能很好地處理動態鍵。您需要使用動態 SQL 執行此操作:
DECLARE @paths nvarchar(max) = (
SELECT STRING_AGG(
QUOTENAME(c.[Key]) N' = MAX(CASE WHEN c.[Key] = ' QUOTENAME(c.[Key], '''') ' THEN c.Value END)', ',
')
FROM (SELECT DISTINCT [Key] FROM dbo.Settings) C
);
DECLARE @sql nvarchar(max) = N'
SELECT
' @cols '
FROM dbo.Settings C
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
';
PRINT @sql; --for testing
EXEC sp_executesql @sql;
uj5u.com熱心網友回復:
你有沒有嘗試改變你的想法?
create table dbo.Settings (
[Key] nvarchar(20),
[Value] nvarchar(20)
);
insert dbo.Settings ([Key], [Value]) values
('userName', 'userNameValue'),
('password', 'passwordValue'),
('domain', 'domainValue');
select [userName], [password], [domain]
from dbo.Settings src
pivot (max([Value]) for [Key] in ([userName], [password], [domain])) pvt
for json path, without_array_wrapper;
這會產生 JSON 結果:
{
"userName": "userNameValue",
"password": "passwordValue",
"domain": "domainValue"
}
uj5u.com熱心網友回復:
由于 Post Owner 對 C# 解決方案開放。
當資料來自 時List<T>,您可以使用Enumerable.ToDictionary轉換為Dictionary<string, string>.
從串列
using System.Linq;
// Result from DB
List<KeyValue> data = new List<KeyValue>
{
new KeyValue
{
Key = "userName", Value = "userNameValue"
},
new KeyValue
{
Key = "password", Value = "passwordValue"
},
new KeyValue
{
Key = "domain", Value = "domainValue"
}
};
Dictionary<string, string> dict = data.ToDictionary(x => x.Key, x => x.Value);
foreach (var kvp in dict)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
public class KeyValue
{
public string Key {get;set;}
public string Value {get;set;}
}
示例程式(來自List<T>)
當資料來自 時DataTable,您迭代dt.Rows并添加到Dictionary<string, string>。
從
DataTable
using System.Data;
#region Mock DataTable
DataTable dt = new DataTable();
dt.Columns.Add("Key", typeof(string));
dt.Columns.Add("Value", typeof(string));
var rowOne = dt.NewRow();
rowOne["Key"] = "userName";
rowOne["Value"] = "userNameValue";
var rowTwo = dt.NewRow();
rowTwo["Key"] = "password";
rowTwo["Value"] = "passwordValue";
var rowThree = dt.NewRow();
rowThree["Key"] = "domain";
rowThree["Value"] = "domainValue";
dt.Rows.Add(rowOne);
dt.Rows.Add(rowTwo);
dt.Rows.Add(rowThree);
#endregion
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach(DataRow row in dt.Rows)
{
dict.Add(row["Key"].ToString(), row["Value"].ToString());
}
foreach (var kvp in dict)
{
Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
示例程式(來自DataTable)
uj5u.com熱心網友回復:
如果您使用 EntityFramework,這就是您的做法:
var dict = _context.Settings.ToDictionary(k => k.Key, v => v.Value);
如果您使用的是 Dapper,那么它看起來像這樣:
var dict = conn.Query<KeyValuePair<string, string>>("SELECT Key, Value FROM Settings")
.ToDictionary(k => k.Key, v => v.Value);
此處使用 Northwind 資料庫的示例:https : //dotnetfiddle.net/22sZ7H
uj5u.com熱心網友回復:
使用串聯構造一個簡單的json物件
DECLARE
@Settings VARCHAR(MAX);
SELECT
@Settings = COALESCE(@Settings ', ', '') '"' C.[Key] '":"' C.[Value] '"'
FROM dbo.Settings C
SELECT CONCAT('{', @Settings, '}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341124.html
標籤:C# sql json sql-server
上一篇:選擇帶有SQLXML空元素的查詢
下一篇:基于日期在SQL中運行總計
