服务键:“键”和值:“值”作为键:值

本文关键字:服务 和值 | 更新日期: 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(它显式实现该接口)并添加对。 您可以根据自己的喜好将结果键入为dynamicExpandoObject

//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 中完成此投影。