服务键:“键”和值:“值”作为键:值
本文关键字:服务 和值 | 更新日期: 2023-09-27 18:30:46
我有从数据库获取的动态键和值,然后使用 Newtonsoft Json.NET 解析,但我不知道如何将它们作为静态键和值提供。
例
这就是我所拥有的
{
"Id": 1,
"IsPublic": false,
"Notes": "",
"Values": [
{
"Key": "1",
"Value": "12.02.1991"
}
]
}
这就是我想要的
{
"Id": 1,
"IsPublic": false,
"Notes": "",
"Values": [
{
"1": "12.02.1991"
}
]
}
我试过什么
我尝试在我的查询本身中手动执行此操作,但它不起作用,因为它试图分配值。
return _db.Archives.Single(x => x.Id == id).Batches.SelectMany(x => x.Items).Select(item => new
{
item.Id,
item.IsPublic,
item.Notes,
Values = item.ArchiveFieldValues.Select(value => new
{
/*
This works just fine
Key = value.ArchiveField.Key,
Value = value.Value
*/
// This is what I tried but it does not work
value.ArchiveField.Key = value.Value
})
}).AsQueryable();
首先,它足够复杂,你可能想把它拉到它自己的函数中。
可以将ExpandoObject
用作对象,该对象可以动态添加和删除属性。 只需将其强制转换为IDictionary
(它显式实现该接口)并添加对。 您可以根据自己的喜好将结果键入为dynamic
或ExpandoObject
。
//I know this isn't the real type of your input;
//modify the parameter to be of the actual type of your collection of pairs
//TODO come up with better name for this function
public static dynamic Foo(IEnumerable<KeyValuePair<string,string>> pairs)
{
IDictionary<string, object> result = new ExpandoObject();
foreach (var pair in pairs)
result.Add(pair.Key, pair.Value);
return result;
}
然后,可以将查询修改为具有:
Values = Foo(item.ArchiveFieldValues),
另请注意,查询提供程序很可能无法对该转换执行任何操作,因此您可能需要在选择之前放入一个AsEnumerable
,以便在 linq to Object 中完成此投影。