我有从db获得的动态键和值,然后使用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();发布于 2013-09-10 17:31:46
首先,它足够复杂,您可能想把它拉到它自己的函数中。
您可以使用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中对对象执行此投影。
https://stackoverflow.com/questions/18725025
复制相似问题