2014-11-25 3 views
8

У меня есть следующий код, который вызывает DocumentDB и создает новый документ Employee. Как я снова преобразую результат в документ Employee? В принципе, я хочу захватить созданный документ и преобразовать его в объект Employee.Преобразование результата созданного документа в 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? 
} 

ответ

5

(Копирование через ответ Эндрю Дэвиса, из DocumentDB MSDN forums, для StackOverflow сообщества)

Самый простой способ будет иметь ваш сотрудник класса унаследованы из документа, а затем бросить result.Resource сотруднику. Если вы не хотите наследовать от документа, вы также можете определить явное литье между документом и сотрудником.

Наличие класса Employee, наследуемого от документа, должно работать готово, если имена членов вашего класса Employee соответствуют именам соответствующих свойств представления JSON.

Определение собственного преобразования типов дает вам больше контроля, и может выглядеть примерно так:

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

Это будет определять явное приведение из документа в Employee. Вы должны убедиться, что строки GetPropertyValue (и аргументы типа) соответствуют вашим свойствам JSON.

+0

Ага! Он ответил на мой вопрос. Я ценю ваш ответ на этот форум. – Sam

+1

Это может работать при вызове CreateDocumentAsync, так как вы уже создали экземпляр Employee. Но если вы хотите также иметь возможность вызвать ReadDocumentAsync, чтобы вернуть 1 объект, вы не можете отдать _that_ обратно Employee. Для этого вам нужно выполнить динамическое преобразование, например, ответ Arnab, или сериализовать возвращенный документ ресурсов. – Andy

22

Вы можете сделать динамическое приведение так:

Employee emp = (dynamic)result.Resource;

+0

Спасибо за этот отзыв! –

+1

Это замечательно! Я не могу найти документацию о том, что это на самом деле - насколько я могу судить, (динамический) должен просто отключить проверку типов, а не выполнять такую ​​магию. Кроме того, это означает, что я понятия не имею, как воспроизвести его в F #. Идеи? – Lamarth

+0

@ Lamarth Не уверен, почему это работает. Кроме того, не работали над F #, поэтому не могу сказать. Не стесняйтесь обновлять ответ, если вы это выясните :) –

1

Я написал метод расширения, чтобы сделать это:

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

Затем вы можете использовать его как

Document d; 
var myObj = await d.ReadAsAsync<MyObject>(); 
Смежные вопросы