Condividi tramite


Caricamento di contenuto posticipato (WCF Data Services)

Per impostazione predefinita, WCF Data Services limita la quantità di dati restituiti da una query. 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. In questo argomento viene descritto come caricare questo tipo di contenuto posticipato nell'applicazione.

Entità correlate

Quando si esegue una query, vengono restituite solo le entità incluse nel set di entità indirizzato. 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. Inoltre, quando nel servizio dati è abilitato il paging, è necessario caricare in modo esplicito le pagine di dati successive dal servizio. Per caricare le entità correlate è possibile utilizzare due modi:

  • Caricamento eager: è possibile utilizzare l'opzione query $expand per richiedere che la query restituisca le entità correlate mediante associazione al set di entità richiesto dalla query. Utilizzare il metodo Expand su DataServiceQuery<TElement> per aggiungere l'opzione $expand alla query inviata al servizio dati. È possibile richiedere più set di entità correlati separandoli con una virgola, come illustrato nell'esempio seguente. Tutte le entità richieste dalla query vengono restituite in un'unica risposta. Nell'esempio seguente vengono restituiti Order_Details e Customers insieme al set di entità Orders:

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

    In WCF Data Services il numero di set di entità che possono essere inclusi in una sola query è limitato a 12 tramite l'opzione query $expand.

  • Caricamento esplicito: è possibile chiamare il metodo LoadProperty sull'istanza di DataServiceContext per caricare in modo esplicito le entità correlate. Ogni chiamata del metodo LoadProperty determina la creazione di una richiesta distinta al servizio dati. Nell'esempio seguente viene caricato in modo esplicito Order_Details per un'entità Orders.

    ' 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 utilizzare 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. Utilizzare 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. 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. Per ulteriori informazioni, vedere Procedura: caricare entità correlate (WCF Data Services).

Contenuto di paging

Quando nel servizio dati è abilitato il paging, il numero di voci incluse nel feed restituito dal servizio dati è limitato dalla configurazione del servizio dati. È possibile impostare i limiti di paging separatamente per ogni set di entità. Per ulteriori informazioni, vedere Configurazione del servizio dati (WCF Data Services). Quando il paging è abilitato, la voce finale nel feed contiene un collegamento alla pagina di dati successiva. Questo collegamento è incluso in un oggetto DataServiceQueryContinuation<T>. È possibile ottenere l'URI della pagina successiva di dati chiamando il metodo GetContinuation sull'oggetto QueryOperationResponse<T> restituito durante l'esecuzione di DataServiceQuery<TElement>. L'oggetto DataServiceQueryContinuation<T> restituito viene quindi utilizzato per caricare la pagina di risultati successiva. Prima di chiamare il metodo GetContinuation, è necessario enumerare i risultati della query. Considerare la possibilità di utilizzare un ciclo do…while per enumerare innanzitutto i risultati della query e verificare quindi se il valore del collegamento successivo corrisponde a non-null. Quando il metodo GetContinuation restituisce null (Nothing in Visual Basic), significa che per la query originale non sono disponibili pagine di risultati aggiuntive. 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.

' 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
// 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);

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. 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.

' 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 at least v2 of the OData protocol.
config.DataServiceBehavior.MaxProtocolVersion =
    System.Data.Services.Common.DataServiceProtocolVersion.V3;

In questo caso, sarà necessario implementare il paging per i feed dell'entità Customers di primo livello e feed dell'entità Orders annidati. Nell'esempio seguente viene illustrato il ciclo while utilizzato per caricare pagine di entità Orders correlate a un'entità Customers selezionata.

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

Per ulteriori informazioni, vedere Procedura: caricare risultati di paging (WCF Data Services).

Flussi di dati binari

WCF Data Services consente di accedere a dati BLOB (Binary Large Object) come flusso di dati. Il flusso posticipa il caricamento dei dati binari fino al momento opportuno per consentire al client di elaborare i dati in maniera più efficiente. Per trarre vantaggio da questa funzionalità, il servizio dati deve implementare il provider IDataServiceStreamProvider. Per ulteriori informazioni, vedere Provider di flusso (WCF Data Services). Quando il flusso è abilitato, i tipi di entità vengono restituiti senza i dati binari correlati. In tal caso, è necessario utilizzare il metodo GetReadStream della classe DataServiceContext per accedere al flusso di dati per i dati binari provenienti dal servizio. In modo analogo, utilizzare il metodo SetSaveStream per aggiungere o modificare i dati binari di un'entità come flusso. Per ulteriori informazioni, vedere Utilizzo di dati binari (WCF Data Services).

Vedere anche

Concetti

Esecuzione di query sul servizio dati (WCF Data Services)

Altre risorse

Client dati (WCF Data Services)