2016-10-12 20 views
0

は、私は、このアイテム DocumentDBに子クラスのデータを格納する方法は?

public class SingleItemResponse : Items 
{ 
    public string Id { get; set; } 
} 
public class MultipletemResponse : Items 
{ 
    public IEnumerable<string> Ids { get; set; } 
} 

私はアイテムのリストにSingleItemResponsesとMultipleItemResponsesのリストを追加した

の2つのサブクラスを持つ親クラス

public class Items{ 
    public Type FeedType { get; set; } 
    public double Rating { get; set; } 
} 

を持っています。

var list = new List<ItemResponse>(); 
list.add(single); // assume that single is a object of singleItemResponse 
list.add(multiple); // assume that multiple is a object of multipleitem 

は私がsingleItemResponseとmultipleItemResponseのすべての属性のリストを返すことができます。しかし、私はdocumentDBに格納して検索したいと思います。問題は、DocumentDBにIListとして格納しようとすると、SingleやMultipleFeedItemsの値を保持しません。この場合、IDまたはIDです。

私はそれらを保存して取得する方法を知りたいと思いますが、私は現在、ItemResponseにそれらを一緒に追加することしかできませんが、物事を詰めることなくより良い方法があるかどうかを知りたいと思います。

+0

あなたは '別途DOCDBのエントリを_two_する_one_ DocumentDBエントリまたは二つの項目での単一および複数の項目が含まれているlist'を保存する意味ですか?私の答えがあなたの問題を指摘していないなら、私にコメントを書いてください。 – Youngjae

+0

@Youngjae最初のもの、単一のアイテムと複数のアイテムを含むリストですが、タイプは基本タイプ –

+0

にしか設定できません。見てみな。 – Youngjae

答えて

0

方法1.検索する場合には、JSONの階層

を永続2誘導体化したオブジェクトがIdIdsなどの区別可能な性質を持っている場合、あなたはJObject最初にそれを比較して、あなたのタイプに作成することができます。

string collectionName = "YourCollectionName"; 
Guid id = Guid.Parse("275319a3-d395-46f2-9370-f3eadf691e03"); // Manually set GUID for test purpose. 

Uri documentUri = UriFactory.CreateDocumentUri(DocumentDbDatabaseNameConfig, collectionName, id.ToString()); 
Uri collectionUri = UriFactory.CreateDocumentCollectionUri(DocumentDbDatabaseNameConfig, collectionName); 

// test variables. 
var list = new List<Items>(); 
list.Add(new SingleItemResponse() { Rating = 2.2d, Id = "id" }); 
list.Add(new MultipletemResponse() { Rating = 2.2d, Ids = new List<string>() { "ids1", "ids2"}}); 

JObject jInput = new JObject(); 
jInput.Add("id", id); 
jInput.Add("list", JArray.FromObject(list)); 

// Store data. 
var upsertedResult = _documentDbclient.UpsertDocumentAsync(collectionUri, jInput, null, true).Result; 

// Read stored data. 
var result = _documentDbclient.ReadDocumentAsync(documentUri).Result; 

JObject jResult = (dynamic)result.Resource; 

JArray jArray = (JArray) jResult["list"]; 
foreach (var jElement in jArray) 
{ 
    if (jElement["Id"] != null) 
    { 
     SingleItemResponse single = (SingleItemResponse)jElement.ToObject(typeof(SingleItemResponse)); 
     // Do your job with single instance. 
    } 
    else if (jElement["Ids"] != null) 
    { 
     MultipletemResponse multiple = (MultipletemResponse)jElement.ToObject(typeof(MultipletemResponse)); 
     // Do your job with multiple instance. 
    } 
} 

また、挿入されるデータは以下の通りです。インラインJSONシリアライズされた文字列に

{ 
    "id": "275319a3-d395-46f2-9370-f3eadf691e03", 
    "list": [ 
    { 
     "Id": "id", 
     "Rating": 2.2 
    }, 
    { 
     "Ids": [ 
     "ids1", 
     "ids2" 
     ], 
     "Rating": 2.2 
    } 
    ], 
    "_rid": "KywuAN7aNQABAAAAAAAAAA==", 
    "_self": "dbs/KywuAA==/colls/KywuAN7aNQA=/docs/KywuAN7aNQABAAAAAAAAAA==/", 
    "_etag": "\"0000ee05-0000-0000-0000-57ff9ecb0000\"", 
    "_attachments": "attachments/", 
    "_ts": 1476370121 
} 

方法2クランチ

この方法はthis postからヒントを得ました。私の経験では、各項目に独自の型を含む正しいシリアル化された結果を作成することはできません。しかし、理論的にはうまくいくかもしれません。

JObject jInput = new JObject(); 

// Use custom serialize/deserialize setting. 
JsonSerializerSettings settings = new JsonSerializerSettings 
{ 
    TypeNameHandling = TypeNameHandling.Auto 
}; 

JArray jArray = JArray.FromObject(list); 
string strJson = JsonConvert.SerializeObject(jArray, settings); 

jInput.Add("id", id); 
jInput.Add("strJson", strJson); // treat json just like strings. 

var upsertedResult = _documentDbclient.UpsertDocumentAsync(collectionUri, jInput, null, true).Result; 

var result = _documentDbclient.ReadDocumentAsync(documentUri).Result; 
JObject jResult = (dynamic)result.Resource; 
jResult.ToString().Dump(); 

List<Items> obj = JsonConvert.DeserializeObject<List<Items>>(jResult["strJson"].Value<string>(), settings); 
関連する問題