0

我有从 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();
4

1 回答 1

0

首先,它足够复杂,您可能希望将其拉出到它自己的功能中。

您可以将 anExpandoObject用作可以动态添加和删除属性的对象。只需将其转换为IDictionary(它显式实现该接口)并添加对。您可以将结果键入为 adynamicExpandoObject基于您喜欢的任何一个。

//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选择之前输入 an ,以便在 linq 中对对象进行此投影。

于 2013-09-10T17:31:46.667 回答