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

まず、これは非常に複雑なので、おそらく独自の関数に引き出したいと思うでしょう。

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 でこのプロジェクションが行われるように、おそらく select の前に をスローする必要があることに注意してください。

于 2013-09-10T17:31:46.667 に答える