2014-11-25 16 views
8

Mam następujący kod, który wywołuje DocumentDB i tworzy nowy dokument Employee. Jak mogę ponownie przekonwertować wynik do dokumentu pracownika? Zasadniczo chcę przechwycić utworzony dokument i przekonwertować go na obiekt pracownika.Konwertowanie utworzonego wyniku dokumentu na 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? 
} 

Odpowiedz

5

(Kopiowanie odpowiedź Andrew Davisa, z DocumentDB MSDN forums, dla społeczności stackoverflow)

Najprostszym sposobem byłoby mieć twój pracownik klasy dziedziczą z dokumentu, a następnie rzucić result.Resource do pracownika. Jeśli nie chcesz dziedziczyć z dokumentu, możesz także zdefiniować wyraźną rzutowanie między dokumentem a pracownikiem.

Posiadanie klasy odziedziczonej po dokumencie powinno być gotowe do użycia, jeśli nazwy członków klasy pracownika odpowiadają nazwom odpowiednich właściwości reprezentacji JSON.

Definiowanie własnego konwersję typu daje większą kontrolę i może wyglądać tak:

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

To określenie wyraźnego obsady z dokumentu do pracownika. Musisz upewnić się, że łańcuchy GetPropertyValue (i argumenty typu) pasują do właściwości JSON.

+0

Tak! Odpowiedział tam na moje pytanie. Doceniam twoją odpowiedź na to forum. – Sam

+1

Może to działać podczas wywoływania CreateDocumentAsync, ponieważ utworzono już instancję Employee. Ale jeśli chcesz także móc wywoływać ReadDocumentAsync, aby zwrócić 1 obiekt, nie możesz oddać _atemu z powrotem do pracownika. W tym celu musisz obsadzić dynamiczną obsadę, jak na przykład odpowiedź Arnaba, lub serializować zwrócony dokument Resource. – Andy

22

Można zrobić dynamiczną obsady takiego:

Employee emp = (dynamic)result.Resource;

+0

Dzięki za tę wskazówkę! –

+1

To fantastyczne! Nie mogę znaleźć dokumentacji na temat tego, co tak naprawdę - o ile mogę powiedzieć, (dynamiczny) powinien po prostu wyłączyć sprawdzanie typu, nie wykonywać magii w ten sposób. Oznacza to również, że nie mam pojęcia, jak go odtworzyć w języku F #. Pomysły? – Lamarth

+0

@Lamarth Nie wiem, dlaczego to działa. Ponadto nie działało na F #, więc nie można powiedzieć. Jeśli ją wymyślisz, zaktualizuj odpowiedź :) –

1

napisałem metodę rozszerzenia, aby to zrobić:

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

Wtedy można go używać jak

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