服务键:“钥匙”&价值:“价值”为关键:价值

时间:2013-09-10 17:09:37

标签: c# linq entity-framework linq-to-entities json.net

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

1 个答案:

答案 0 :(得分:0)

首先,它很复杂,你可能想把它拉出来自己的功能。

您可以使用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),

另请注意,查询提供程序很可能无法对该转换执行任何操作,因此您可能需要在select之前引入AsEnumerable,以便在linq中完成此投影对象。