2014-11-25 15 views
8

Ho il seguente codice che chiama DocumentDB e crea un nuovo documento Employee. Come posso quindi convertire nuovamente il risultato in documento Dipendente? Fondamentalmente, voglio acquisire il documento creato e convertirlo in oggetto Employee.Conversione del risultato del documento creato in 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? 
} 

risposta

5

(copia su risposta di Andrew Davis, dal DocumentDB MSDN forums, per la comunità StackOverflow)

Il modo più semplice sarebbe quella di avere la classe Employee ereditare dal documento, e poi gettati result.Resource a dipendenti. Se non si desidera ereditare dal documento, è anche possibile definire un cast esplicito tra documento e impiegato.

Avere la classe Employee ereditata da Document dovrebbe funzionare immediatamente se i nomi dei membri della classe Employee corrispondono ai nomi delle proprietà corrispondenti della rappresentazione JSON.

Definizione del tipo di conversione consente un maggiore controllo, e potrebbe essere simile a questo:

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; 
} 

Questo sarebbe di definire un cast esplicito dal documento al dipendente. Dovrai assicurarti che le stringhe GetPropertyValue (e digiti gli argomenti) corrispondano alle tue proprietà JSON.

+0

Sì! Ha risposto alla mia domanda lì. Apprezzo che tu abbia risposto anche a questo forum. – Sam

+1

Questo potrebbe funzionare quando si chiama CreateDocumentAsync poiché è già stata creata un'istanza Employee. Ma se vuoi anche essere in grado di chiamare ReadDocumentAsync per restituire 1 oggetto, non puoi trasmettere _that_ di nuovo a Employee. Per questo è necessario eseguire il cast dinamico come la risposta di Arnab o serializzare il documento Resource restituito. – Andy

22

Si può fare un cast dinamico come questo:

Employee emp = (dynamic)result.Resource;

+0

Grazie per questo suggerimento! –

+1

È fantastico! Non riesco a trovare documentazione su ciò che effettivamente fa - per quanto posso dire, (dinamico) dovrebbe semplicemente disabilitare il controllo dei tipi, non eseguire la magia in questo modo. Inoltre, significa che non ho idea di come riprodurlo in F #. Idee? – Lamarth

+0

@Lamarth Non so perché funzioni. Inoltre, non ho lavorato su F #, quindi non posso dire. Sentiti libero di aggiornare la risposta se lo trovi :) –

1

ho scritto un metodo di estensione per fare questo:

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()); 
    } 
} 

Quindi è possibile utilizzarlo come

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