我有从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();
答案 0 :(得分:0)
首先,它很复杂,你可能想把它拉出来自己的功能。
您可以使用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),
另请注意,查询提供程序很可能无法对该转换执行任何操作,因此您可能需要在select之前引入AsEnumerable
,以便在linq中完成此投影对象。