将创建的文档结果转换为POCO

时间:2014-11-25 04:47:35

标签: azure-cosmosdb

我有以下代码调用DocumentDB并创建一个新的Employee文档。如何再将结果转换为Employee文档?基本上,我想捕获创建的文档并将其转换为Employee对象。

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

4 个答案:

答案 0 :(得分:41)

你可以做这样的动态演员:

Employee emp = (dynamic)result.Resource;

答案 1 :(得分:7)

(复制Andrew Davis的答案,来自DocumentDB MSDN forums,对于stackoverflow社区)

最简单的方法是让您的Employee类继承Document,然后将result.Resource转换为Employee。如果您不想从Document继承,您还可以在Document和Employee之间定义显式强制转换。

如果Employee类的成员名称与JSON表示的相应属性的名称匹配,那么从Document继承的Employee类应该是开箱即用的。

定义自己的类型转换可以让您获得更多控制权,可能看起来像这样:

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

这将定义从Document到Employee的显式转换。您必须确保GetPropertyValue字符串(和类型参数)与您的JSON属性匹配。

答案 2 :(得分:4)

我写了一个扩展方法来执行此操作:

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

答案 3 :(得分:0)

这是一个同步扩展方法,不会像(dynamic)强制转换方法那样默默地丢失属性。使用最新的.NET Core功能Span和System.Text.Json来提高性能。

用法:

Document doc; // source Document
MyType converted = doc.ConvertTo<MyType>();

实施:

public static T ConvertTo<T>(this Document item)
{
    using var stream = new MemoryStream();
    item.SaveTo(stream);
    var bytes = new ReadOnlySpan<byte>(stream.GetBuffer()).Slice(0, (int)stream.Length);
    return JsonSerializer.Deserialize<T>(bytes);
}