延迟的内容(JSON ADO.NET 数据服务框架)

有时,在来自 ADO.NET 数据服务的响应中返回的数据量会非常大。为了节省带宽或 CPU 周期,数据服务可能不会返回针对请求的完整响应。ADO.NET 数据服务可能会延迟发送响应的几乎任何部分;ADO.NET 数据服务将很可能延迟导航属性或大属性值(如 BLOBS 或图像)的序列化。

下面的示例演示 ADO.NET 数据服务如何指示使用 JSON 序列化的延迟内容。若存在两个实体类型(如 CustomerOrder),其中,一个客户与多个订单关联,则 Customer 实体的默认序列化如下所示:

{ "d":
 { 
    __metadata: {
        uri: "Customers(\'NTSOS\')", type: "NorthwindModel.Customers"
    }, CustomerID: "NTSOS", CompanyName: "Contoso Ltd",
        Address: "1010 Street", Orders: {
        __deferred: {
            uri: "Customers(\'NTSOS\')/Orders" 
        }
    }
 }
}

本示例中的 __deferred 属性指示不返回 Order 元素的值。若要检索这些值,则必须直接向 Customers(\'NTSOS\')/Orders 发出 GET 请求。

JSON 中延迟的内容规则

若使用的是 JSON 序列化,则下面的规则控制在 ADO.NET 数据服务中对延迟内容的使用:

  • 序列化中不会返回 __deferred 命令批注的属性内容。请求者可通过对父元素执行 GET 请求来检索内容。请求者还可以包含 $expand 查询选项以避免出现延迟。有关更多信息,请参见 ADO.NET 数据服务系统查询选项

  • 除非最外面的对象未包含任何其他属性,否则 __deferred 属性不得为该对象的属性。

  • __deferred 属性并不表示有内容被延迟,而是指示可能有内容尚未计算或序列化。

  • 默认情况下,ADO.NET 数据服务将延迟对以下类型的数据的序列化:

    • 导航属性值。

    • 链接值。

    • 类型为 Edm.Binary 的属性值。

  • 无法延迟类型为 EdmType.Binary 的属性值。

示例

下一个示例演示空 Customers 实体集的 JSON 序列化:

{ "d": [ ] }

下面的示例演示 Customers 实体集的 JSON 序列化,此实体集包含名为 Customer 的实体类型的两个实例。与 Customers 相关的订单将不会进行内联扩展,这是默认行为。

{ "d": [ 
    {
        __metadata: {
           uri: "Customers(\'NTSOS\')", type: "NorthwindModel.Customer"
        }, 
        CustomerID: "NTSOS", 
        CompanyName: "Contoso Ltd", 
        Address: "1010 Street",
        Orders: {
            __deferred: {
                uri: "Customers(NTSOS)/Orders"
            }
        }        
    },    
    {
        __metadata: {
            uri: "Customers(FABRK)", type: "NorthwindModel.Customer"
        }, 
        CustomerID: "FABRK", 
        CompanyName: "Fabrikam Inc", 
        "2020 Street",
        Orders: {
            __deferred: {
                uri: "Customers(\'FABRK\')/Orders"
            }
        },
    }
  ]
}

下面的示例演示 Customer 实体类型的 JSON 序列化,此实体类型包含所有已内联序列化的相关 Orders

{ "d": 
{
        __metadata: {
            uri: "Customers(NTSOS)", type: "NorthwindModel.Customer"
        }, 
        CustomerID: "NTSOS", 
        CompanyName: "Contoso Ltd", 
        Address: "1010 Street",
     Orders: [ 
                {
                    __metadata: {
                           uri: "Customers(NTSOS)/Orders", 
                           type: "NorthwindModel.Order" 
                        },
                    ShippedDate: "\/Date(1202321)\/",
                    ShipAddress: "1010 Street",
                    Customers: {
                                  __deferred: {
                                  Uri: "Customers(\'NTSOS\')/Orders/Customers"
                                }
                 }
                 ]
}
}

下面的示例演示单个 Customer 实体类型实例的 JSON 序列化,此实例包含一个空字符串作为其公司名称,并且其地址属性为 null:

{ "d": 
{
        __metadata: {
            uri: "Customers(NTSOS)", type: "NorthwindModel.Customer"
        }, 
        CustomerID: "NTSOS", 
        CompanyName: "Contoso Ltd", 
        Address: null,
        Orders: {
            __deferred: {
                uri: "Customers(NTSOS)/Orders"
            }
        }
}
}

下一个示例演示 Customer 实体类型上的 CustomerID 属性的 JSON 序列化,其中,该属性的类型为字符串,值为 NTSOS

"NTSOS"

此示例与上一个 JSON 示例相同,只不过请求的序列化针对的是不带附加元数据的值;没有任何环绕 JSON 标记。

NTSOS

另请参见

概念

JSON 序列化规则(ADO.NET 数据服务框架)
JSON 格式(ADO.NET 数据服务框架)
ADO.NET 数据服务的客户端应用程序

其他资源

ADO.NET Data Services Framework