2014-11-25 5 views
8

ich den folgenden Code, der DocumentDB und schafft Dokument einen neuen Mitarbeiter ruft. Wie konvertiere ich das Ergebnis dann wieder in Mitarbeiterdokument? Grundsätzlich möchte ich das erstellte Dokument erfassen und in Mitarbeiter-Objekt konvertieren.Converting erstelltes Dokument Ergebnis POCO

var result = await client.CreateDocumentAsync(collection.SelfLink, employee); 

if(result.StatusCode == System.Net.HttpStatusCode.Created) 
{ 
    Employee emp = result.Resource; // How do I convert the result to Employee object here? 
} 

Antwort

5

(Kopieren über die Antwort von Andrew Davis, vom DocumentDB MSDN forums, für die Stackoverflow-Community)

Der einfachste Weg, um Ihre Mitarbeiter-Klasse erben von Dokument zu haben wäre, und warf dann result.Resource an Mitarbeiter. Wenn Sie nicht von Dokument erben möchten, können Sie auch eine explizite Umwandlung zwischen Dokument und Mitarbeiter definieren.

Wenn die Employee-Klasse von Document geerbt wird, sollte sie out-of-the-box funktionieren, wenn die Namen der Member Ihrer Employee-Klasse den Namen der entsprechenden Eigenschaften der JSON-Repräsentation entsprechen.

Ihre eigene Art Konvertierung definieren gibt Ihnen mehr Kontrolle und könnte wie folgt aussehen:

public static explicit operator Employee(Document doc) 
{ 
    Employee emp = new Employee(); 
    emp.Name = doc.GetPropertyValue<string>("employeeName"); 
    emp.Number = doc.GetPropertyValue<int>("employeeNumber"); 
    /* and so on, for all the properties of Employee */ 
    return emp; 
} 

Dies würde eine explizite Umwandlung von Dokument Mitarbeiter definieren. Sie müssen sicherstellen, dass die GetPropertyValue-Zeichenfolgen (und Argumente eingeben) mit Ihren JSON-Eigenschaften übereinstimmen.

+0

Jep! Er hat meine Frage dort beantwortet. Ich weiß es zu schätzen, dass Sie die Antwort auch auf dieses Forum gebracht haben. – Sam

+1

Dies funktioniert möglicherweise beim Aufruf von CreateDocumentAsync, da Sie bereits eine Employee-Instanz erstellt haben. Wenn Sie jedoch auch ReadDocumentAsync aufrufen können, um 1 Objekt zurückzugeben, können Sie _that_ nicht an Mitarbeiter zurückgeben. Dazu müssen Sie wie Arnabs Antwort dynamisch umwandeln oder das zurückgegebene Ressourcendokument serialisieren. – Andy

22

Sie können eine dynamische Umwandlung wie folgt tun:

Employee emp = (dynamic)result.Resource;

+0

Danke für diesen Tipp! –

+1

Das ist fantastisch! Ich kann anscheinend keine Dokumentation darüber finden, was das tatsächlich tut - soweit ich das beurteilen kann, sollte (dynamisch) einfach die Typprüfung deaktivieren, keine Magie wie diese ausführen. Außerdem bedeutet das, dass ich keine Ahnung habe, wie ich es in F # reproduzieren kann. Ideen? – Lamarth

+0

@Lamarth Nicht sicher, warum es funktioniert. Habe auch nicht an F # gearbeitet, kann also nicht sagen. Fühlen Sie sich frei, die Antwort zu aktualisieren, wenn Sie es herausfinden :) –

1

ich eine Erweiterungsmethode geschrieben, dies zu tun:

public static async Task<T> ReadAsAsync<T>(this Document d) 
{ 
    using (var ms = new MemoryStream()) 
    using (var reader = new StreamReader(ms)) 
    { 
     d.SaveTo(ms); 
     ms.Position = 0; 
     return JsonConvert.DeserializeObject<T>(await reader.ReadToEndAsync()); 
    } 
} 

Dann können Sie es verwenden, wie

Document d; 
var myObj = await d.ReadAsAsync<MyObject>();