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



我有以下代码调用 DocumentDB 并创建一个新的 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?
}

您可以像这样进行动态转换:

Employee emp = (dynamic)result.Resource;

我写了一个扩展方法来做到这一点:

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

(从 DocumentDB MSDN 论坛复制 Andrew Davis 的答案,用于堆栈溢出社区)

最简单的方法是让 Employee 类从文档继承,然后强制转换结果。员工资源。 如果不想从文档继承,还可以在"文档"和"员工"之间定义显式强制转换。

如果 Employee 类

的成员名称与 JSON 表示形式的相应属性的名称匹配,则让 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;
}

这将定义从文档到员工的显式强制转换。 必须确保 GetPropertyValue 字符串(和类型参数)与 JSON 属性匹配。

这是一个同步扩展方法,它不会像 (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);
}

最新更新