Caricamento di contenuto posticipato (WCF Data Services)Loading Deferred Content (WCF Data Services)

Per impostazione predefinita, WCF Data ServicesWCF Data Services limita la quantità di dati restituiti da una query.By default, WCF Data ServicesWCF Data Services limits the amount of data that a query returns. Se necessario, dal servizio dati è tuttavia possibile caricare in modo esplicito dati aggiuntivi, tra cui entità correlate, dati di risposta di paging e flussi di dati binari.However, you can explicitly load additional data, including related entities, paged response data, and binary data streams, from the data service when it is needed. In questo argomento viene descritto come caricare questo tipo di contenuto posticipato nell'applicazione.This topic describes how to load such deferred content into your application.

Quando si esegue una query, vengono restituite solo le entità incluse nel set di entità indirizzato.When you execute a query, only entities in the addressed entity set are returned. Ad esempio, quando una query eseguita sul servizio dati Northwind restituisce le entità Customers, per impostazione predefinita non vengono restituite le entità Orders correlate, anche se esiste una relazione tra Customers e Orders.For example, when a query against the Northwind data service returns Customers entities, by default the related Orders entities are not returned, even though there is a relationship between Customers and Orders. Inoltre, quando nel servizio dati è abilitato il paging, è necessario caricare in modo esplicito le pagine di dati successive dal servizio.Also, when paging is enabled in the data service, you must explicitly load subsequent data pages from the service. Per caricare le entità correlate è possibile usare due modi:There are two ways to load related entities:

  • Caricamento eager: È possibile utilizzare il $expand opzione di query per richiedere che la query restituisca le entità correlate da un'associazione per l'entità impostare che la query richiesta.Eager loading: You can use the $expand query option to request that the query return entities that are related by an association to the entity set that the query requested. Usare il metodo Expand su DataServiceQuery<TElement> per aggiungere l'opzione $expand alla query inviata al servizio dati.Use the Expand method on the DataServiceQuery<TElement> to add the $expand option to the query that is sent to the data service. È possibile richiedere più set di entità correlati separandoli con una virgola, come illustrato nell'esempio seguente.You can request multiple related entity sets by separating them by a comma, as in the following example. Tutte le entità richieste dalla query vengono restituite in un'unica risposta.All entities requested by the query are returned in a single response. Nell'esempio seguente vengono restituiti Order_Details e Customers insieme al set di entità Orders:The following example returns Order_Details and Customers together with the Orders entity set:

    // Define a query for orders that also returns items and customers.
    DataServiceQuery<Order> query =
        context.Orders.Expand("Order_Details,Customer");
    
    ' Define a query for orders that also returns items and customers.
    Dim query As DataServiceQuery(Of Order) = _
    context.Orders.Expand("Order_Details,Customer")
    

    In WCF Data ServicesWCF Data Services il numero di set di entità che possono essere inclusi in una sola query è limitato a 12 tramite l'opzione query $expand.WCF Data ServicesWCF Data Services limits to 12 the number of entity sets that can be included in a single query by using the $expand query option.

  • Caricamento esplicito: È possibile chiamare il LoadProperty metodo sul DataServiceContext istanza da caricare in modo esplicito le entità correlate.Explicit loading: You can call the LoadProperty method on the DataServiceContext instance to explicitly load related entities. Ogni chiamata del metodo LoadProperty determina la creazione di una richiesta distinta al servizio dati.Each call to the LoadProperty method creates a separate request to the data service. Nell'esempio seguente viene caricato in modo esplicito Order_Details per un'entità Orders.The following example explicitly loads Order_Details for an Orders entity:

    // Explicitly load the order details for each order.
    context.LoadProperty(order, "Order_Details");
    
    ' Explicitly load the order details for each order.
    context.LoadProperty(order, "Order_Details")
    

Nella scelta dell'opzione da usare tener presente che è possibile un compromesso tra il numero di richieste per il servizio dati e la quantità di dati restituiti in una singola risposta.When you consider which option to use, realize that there is a tradeoff between the number of requests to the data service and the amount of data that is returned in a single response. Usare il caricamento eager quando l'applicazione richiede oggetti associati e si desidera evitare la latenza aggiunta per le richieste supplementari necessaria per il loro recupero in modo esplicito.Use eager loading when your application requires associated objects and you want to avoid the added latency of additional requests to explicitly retrieve them. Tuttavia, se vi sono casi in cui l'applicazione necessita solo dei dati per le istanze di entità correlate specifiche, considerare la possibilità di caricare in modo esplicito tali entità chiamando il metodo LoadProperty.However, if there are cases when the application only needs the data for specific related entity instances, you should consider explicitly loading those entities by calling the LoadProperty method. Per ulteriori informazioni, vedere procedura: caricamento di entità correlate.For more information, see How to: Load Related Entities.

Contenuto di pagingPaged Content

Quando nel servizio dati è abilitato il paging, il numero di voci incluse nel feed restituito dal servizio dati è limitato dalla configurazione del servizio dati.When paging is enabled in the data service, the number of entries in the feed that the data service returns is limited by the configuration of the data service. È possibile impostare i limiti di paging separatamente per ogni set di entità.Page limits can be set separately for each entity set. Per ulteriori informazioni, vedere configurazione del servizio dati.For more information, see Configuring the Data Service. Quando il paging è abilitato, la voce finale nel feed contiene un collegamento alla pagina di dati successiva.When paging is enabled, the final entry in the feed contains a link to the next page of data. Questo collegamento è incluso in un oggetto DataServiceQueryContinuation<T>.This link is contained in a DataServiceQueryContinuation<T> object. È possibile ottenere l'URI della pagina successiva di dati chiamando il metodo GetContinuation sull'oggetto QueryOperationResponse<T> restituito durante l'esecuzione di DataServiceQuery<TElement>.You obtain the URI to the next page of data by calling the GetContinuation method on the QueryOperationResponse<T> returned when the DataServiceQuery<TElement> is executed. L'oggetto DataServiceQueryContinuation<T> restituito viene quindi usato per caricare la pagina di risultati successiva.The returned DataServiceQueryContinuation<T> object is then used to load the next page of results. Prima di chiamare il metodo GetContinuation, è necessario enumerare i risultati della query.You must enumerate the query result before you call the GetContinuation method. Considerare la possibilità di usare un ciclo do…while per enumerare innanzitutto i risultati della query e verificare quindi se il valore del collegamento successivo corrisponde a non-null.Consider using a do…while loop to first enumerate the query result and then check for a non-null next link value. Quando il metodo GetContinuation restituisce null (Nothing in Visual Basic), significa che per la query originale non sono disponibili pagine di risultati aggiuntive.When the GetContinuation method returns null (Nothing in Visual Basic), there are no additional result pages for the original query. Nell'esempio seguente viene illustrato un ciclo do…while che carica i dati dei clienti di cui è stato eseguito il paging dal servizio dati Northwind di esempio.The following example shows a do…while loop that loads paged customer data from the Northwind sample data service.

// With a paged response from the service, use a do...while loop 
// to enumerate the results before getting the next link.
do
{
    // Write the page number.
    Console.WriteLine("Page {0}:", pageCount++);

    // If nextLink is not null, then there is a new page to load.
    if (token != null)
    {
        // Load the new page from the next link URI.
        response = context.Execute<Customer>(token)
            as QueryOperationResponse<Customer>;
    }

    // Enumerate the customers in the response.
    foreach (Customer customer in response)
    {
        Console.WriteLine("\tCustomer Name: {0}", customer.CompanyName);
    }
}

// Get the next link, and continue while there is a next link.
while ((token = response.GetContinuation()) != null);
' With a paged response from the service, use a do...while loop 
' to enumerate the results before getting the next link.
Do
    ' Write the page number.
    Console.WriteLine("Page {0}:", pageCount + 1)

    ' If nextLink is not null, then there is a new page to load.
    If token IsNot Nothing Then
        ' Load the new page from the next link URI.
        response = CType(context.Execute(Of Customer)(token),  _
        QueryOperationResponse(Of Customer))
    End If

    ' Enumerate the customers in the response.
    For Each customer As Customer In response
        Console.WriteLine(vbTab & "Customer Name: {0}", customer.CompanyName)
    Next

    ' Get the next link, and continue while there is a next link.
    token = response.GetContinuation()
Loop While token IsNot Nothing

Quando una query richiede che le entità correlate vengano restituite in un'unica risposta insieme al set di entità richiesto, è possibile che i limiti di paging abbiano effetto sui feed annidati inclusi inline con la risposta.When a query requests that related entities are returned in a single response together with the requested entity set, paging limits may affect nested feeds that are included inline with the response. Ad esempio, quando un limite di paging viene impostato nel servizio dati Northwind di esempio per il set di entità Customers, è inoltre possibile impostare un limite di paging indipendente per il set di entità Orders correlato, come illustrato nell'esempio seguente relativo al file Northwind.svc.cs che definisce il servizio dati Northwind di esempio.For example, when a paging limit is set in the Northwind sample data service for the Customers entity set, an independent paging limit can also be set for the related Orders entity set, as in the following example from the Northwind.svc.cs file that defines the Northwind sample data service.

// Set page size defaults for the data service.
config.SetEntitySetPageSize("Orders", 20);
config.SetEntitySetPageSize("Order_Details", 50);
config.SetEntitySetPageSize("Products", 50);

// Paging requires v2 of the OData protocol.
config.DataServiceBehavior.MaxProtocolVersion =
    System.Data.Services.Common.DataServiceProtocolVersion.V2;
' Set page size defaults for the data service.
config.SetEntitySetPageSize("Orders", 20)
config.SetEntitySetPageSize("Order_Details", 50)
config.SetEntitySetPageSize("Products", 50)

' Paging requires v2 of the OData protocol.
config.DataServiceBehavior.MaxProtocolVersion = _
    System.Data.Services.Common.DataServiceProtocolVersion.V2

In questo caso, sarà necessario implementare il paging per i feed dell'entità Customers di primo livello e feed dell'entità Orders annidati.In this case, you must implement paging for both the top-level Customers and the nested Orders entity feeds. Nell'esempio seguente viene illustrato il ciclo while usato per caricare pagine di entità Orders correlate a un'entità Customers selezionata.The following example shows the while loop used to load pages of Orders entities related to a selected Customers entity.

while (nextOrdersLink != null)
{
    foreach (Order o in c.Orders)
    {
        // Print out the orders.
        Console.WriteLine("\t\tOrderID: {0} - Freight: ${1}",
            o.OrderID, o.Freight);
    }

    // Load the next page of Orders.
    var ordersResponse = context.LoadProperty(c, "Orders", nextOrdersLink);
    nextOrdersLink = ordersResponse.GetContinuation();
}
While nextOrdersLink IsNot Nothing
    For Each o As Order In c.Orders
        ' Print out the orders.
        Console.WriteLine(vbTab & vbTab & "OrderID: {0} - Freight: ${1}", _
                o.OrderID, o.Freight)
    Next
    ' Load the next page of Orders.
    Dim ordersResponse = _
    context.LoadProperty(c, "Orders", nextOrdersLink)
    nextOrdersLink = ordersResponse.GetContinuation()
End While

Per ulteriori informazioni, vedere come: risultati di paging carico.For more information, see How to: Load Paged Results.

Flussi di dati binariBinary Data Streams

WCF Data ServicesWCF Data Services consente di accedere a dati BLOB (Binary Large Object) come flusso di dati. enables you to access binary large object (BLOB) data as a data stream. Il flusso posticipa il caricamento dei dati binari fino al momento opportuno per consentire al client di elaborare i dati in maniera più efficiente.Streaming defers the loading of binary data until it is needed, and the client can more efficiently process this data. Per trarre vantaggio da questa funzionalità, il servizio dati deve implementare il provider IDataServiceStreamProvider.In order to take advantage of this functionality, the data service must implement the IDataServiceStreamProvider provider. Per ulteriori informazioni, vedere Provider di flusso.For more information, see Streaming Provider. Quando il flusso è abilitato, i tipi di entità vengono restituiti senza i dati binari correlati.When streaming is enabled, entity types are returned without the related binary data. In questo caso, è necessario utilizzare il GetReadStream metodo la DataServiceContext classe per accedere al flusso di dati per i dati binari dal servizio.In this case, you must use the GetReadStream method of the DataServiceContext class to access the data stream for the binary data from the service. In modo analogo, usare il metodo SetSaveStream per aggiungere o modificare i dati binari di un'entità come flusso.Similarly, use the SetSaveStream method to add or change binary data for an entity as a stream. Per ulteriori informazioni, vedere funziona con dati binari.For more information, see Working with Binary Data.

Vedere ancheSee Also

Libreria client WCF Data ServicesWCF Data Services Client Library
Esecuzione di query sul servizio datiQuerying the Data Service