Laden von verzögertem Inhalt (WCF Data Services)

Standardmäßig schränkt WCF Data Services die Datenmenge ein, die eine Abfrage zurückgibt. Sie können jedoch explizit weitere Daten aus dem Datendienst laden, einschließlich verknüpfter Entitäten, ausgelagerter Antwortdaten und binärer Datenströme, wenn sie benötigt werden. In diesem Thema wird beschrieben, wie dieser verzögerte Inhalt in die Anwendung geladen wird.

Verknüpfte Entitäten

Beim Ausführen einer Abfrage werden nur Entitäten in der behandelten Entitätenmenge zurückgegeben. Wenn beispielsweise eine Abfrage des Northwind-Datendiensts Customers-Entitäten zurückgibt, werden die verknüpften Orders-Entitäten standardmäßig nicht zurückgegeben, obwohl eine Beziehung zwischen Customers und Orders besteht. Außerdem müssen Sie, wenn Paging im Datendienst aktiviert ist, explizit nachfolgende Datenseiten aus dem Dienst laden. Es gibt zwei Möglichkeiten zum Laden verknüpfter Entitäten:

  • Eager Loading: Sie können die $expand-Abfrageoption verwenden, um anzufordern, dass die Abfragerückgabeentitäten über eine Zuordnung in Beziehung mit der Entitätenmenge stehen, die die Abfrage angefordert hat. Verwenden Sie die Expand-Methode für die DataServiceQuery<TElement>, um der Abfrage, die an den Datendienst gesendet werden soll, die $expand-Option hinzuzufügen. Sie können mehrere verknüpfte Entitätenmengen anfordern, indem Sie sie wie im folgenden Beispiel durch ein Komma trennen. Alle von der Abfrage angeforderten Entitäten werden in einer einzelnen Antwort zurückgegeben. Im folgenden Beispiel werden Order_Details und Customers zusammen mit der Orders-Entitätenmenge zurückgegeben:

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

    WCF Data Services beschränkt die Anzahl von Entitätenmengen, die mit der $expand-Abfrageoption in einer einzelnen Abfrage enthalten sein können, auf 12.

  • Explizites Laden: Sie können die LoadProperty-Methode für die DataServiceContext-Instanz aufrufen, um verknüpfte Entitäten explizit zu laden. Jeder Aufruf der LoadProperty-Methode erstellt eine separate Anforderung an den Datendienst. Im folgenden Beispiel werden Order_Details für eine Orders-Entität explizit geladen:

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

Denken Sie beim Auswählen der Option daran, dass zwischen der Anzahl der Abfragen des Datendiensts und der in einer einzelnen Antwort zurückgegebenen Datenmenge abgewogen werden sollte. Verwenden Sie Eager Loading, wenn die Anwendung zugeordnete Objekte erfordert und Sie die hinzugefügte Latenzzeit von zusätzlichen Anforderungen zum expliziten Abrufen vermeiden möchten. Allerdings sollten Sie in Fällen, wenn die Anwendung die Daten nur für bestimmte verknüpfte Entitätsinstanzen benötigt, das explizite Laden dieser Entitäten durch Aufrufen der LoadProperty-Methode in Betracht ziehen. Weitere Informationen finden Sie unter Gewusst wie: Laden von verknüpften Entitäten (WCF Data Services).

Ausgelagerter Inhalt

Wenn Paging im Datendienst aktiviert ist, ist die Anzahl von Einträgen im Feed, die der Datendienst zurückgibt, durch die Konfiguration des Datendiensts beschränkt. Seitenbeschränkungen können für jede Entitätenmenge separat festgelegt werden. Weitere Informationen finden Sie unter Konfigurieren des Datendiensts (WCF Data Services). Wenn Paging aktiviert ist, enthält der abschließende Eintrag im Feed einen Link zur nächsten Seite mit Daten. Dieser Link ist in einem DataServiceQueryContinuation<T>-Objekt enthalten. Sie erhalten den URI zur nächsten Seite mit Daten, indem Sie die GetContinuation-Methode für die QueryOperationResponse<T> aufrufen, die beim Ausführen der DataServiceQuery<TElement> zurückgegeben wird. Das zurückgegebene DataServiceQueryContinuation<T>-Objekt wird dann verwendet, um die nächste Seite mit Ergebnissen zu laden. Sie müssen vor dem Aufrufen der GetContinuation-Methode das Abfrageergebnis aufzählen. Verwenden Sie eine do…while-Schleife, um zuerst das Abfrageergebnis aufzuzählen und dann den nächsten non-null-Linkwert zu suchen. Wenn die GetContinuation-Methode null (Nothing in Visual Basic) zurückgibt, sind keine zusätzlichen Ergebnisseiten für die ursprüngliche Abfrage vorhanden. Im folgenden Beispiel wird eine do…while-Schleife gezeigt, die ausgelagerte Kundendaten aus dem Northwind-Beispieldatendienst lädt.

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

Wenn eine Abfrage anfordert, dass verknüpfte Entitäten in einer einzelnen Antwort zusammen mit der angeforderten Entitätenmenge zurückgegeben werden, wirken sich Paginggrenzen möglicherweise auf geschachtelte Feeds aus, die inline in der Antwort enthalten sind. Wenn beispielsweise eine Paginggrenze im Northwind-Beispieldatendienst für die Customers-Entitätenmenge festgelegt wird, kann eine unabhängige Paginggrenze auch für die verknüpfte Orders-Entitätenmenge festgelegt werden, wie im folgenden Beispiel für die Datei Northwind.svc.cs, die den Northwind-Beispieldatendienst definiert.

' 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 diesem Fall müssen Sie Paging sowohl für die Customers-Entitätenmenge der obersten Ebene als auch die geschachtelte Orders-Entitätenmenge implementieren. Im folgenden Beispiel wird die while-Schleife gezeigt, mit der Seiten von Orders-Entitäten geladen werden, die mit einer ausgewählten Customers-Entität verknüpft sind.

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

Weitere Informationen finden Sie unter Gewusst wie: Laden von ausgelagerten Ergebnissen (WCF Data Services).

Binäre Datenströme

WCF Data Services ermöglicht es Ihnen, auf BLOB (Binary Large Object)-Daten als Datenstrom zuzugreifen. Streaming verzögert das Laden binärer Daten, bis sie benötigt werden, und der Client kann diese Daten effizienter verarbeiten. Um diese Funktionalität zu nutzen, muss der Datendienst den IDataServiceStreamProvider-Anbieter implementieren. Weitere Informationen finden Sie unter Streaminganbieter (WCF Data Services). Wenn Streaming aktiviert ist, werden Entitätstypen ohne die verknüpften binären Daten zurückgegeben. In diesem Fall müssen Sie die GetReadStream-Methode der DataServiceContext-Klasse verwenden, um auf den Datenstrom für die binären Daten aus dem Dienst zuzugreifen. Verwenden Sie entsprechend die SetSaveStream-Methode, um binäre Daten für eine Entität als Datenstrom hinzuzufügen oder zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Binärdaten (WCF Data Services).

Siehe auch

Konzepte

Abfragen des Datendiensts (WCF Data Services)

Andere Ressourcen

Datenclient (WCF Data Services)