共用方式為


載入延後的內容 (WCF 資料服務)

根據預設,WCF Data Services 會限制查詢傳回的資料量。 不過,您可以在需要時,從資料服務明確載入其他資料,包括相關實體、分頁回應資料,以及二進位資料流。 本主題描述如何將這些延後的內容載入至應用程式。

相關實體

執行查詢時,只會傳回已定址實體集中的實體。 例如,針對 Northwind 資料服務的查詢傳回 Customers 實體時,即使 CustomersOrders 之間有關聯性,根據預設,仍不會傳回相關的 Orders 實體。 另外,在資料服務中啟用分頁時,您必須從服務明確載入後續資料頁面。 有兩種方式可以載入相關實體:

  • 積極式載入:您可以使用 $expand 查詢選項,要求查詢傳回的實體與查詢要求之實體集的關聯有所相關。 請在 DataServiceQuery 上使用 Expand 方法,將 $expand 選項加入至傳送給資料服務的查詢。 您可以要求多個相關的實體集,以逗號分隔這些實體集,如下列範例所示。 查詢要求的所有實體會以單一回應傳回。 下列範例會一併傳回 Order_DetailsCustomers,以及 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");
    

    WCF Data Services 會使用 $expand 查詢選項限制為可包含在單一查詢中的 12 個實體集數目。

  • 明確式載入:您可以在 DataServiceContext 執行個體上呼叫 LoadProperty 方法,明確載入相關實體。 每次呼叫 LoadProperty 方法,都會對資料服務建立一個獨立的查詢。 下列範例會明確載入 Orders 實體的 Order_Details

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

考慮要使用哪一種方式時,請了解,對資料服務要求的數目與單一回應所傳回的資料量之間必須有所取捨。 當您的應用程式需要相關物件,且您要避免明確擷取物件之額外要求所新增的延遲時,請使用積極式載入 不過,在有些情況下,當應用程式只需要特定相關實體執行個體的資料時,您應該考慮呼叫 LoadProperty 方法,明確載入這些實體。 如需詳細資訊,請參閱 HOW TO:載入相關實體 (WCF Data Services)

分頁內容

在資料服務中啟用分頁時,資料服務在摘要中傳回的項目數量會受限於資料服務的配置。 分頁限制可以針對每個實體集進行個別設定。 如需詳細資訊,請參閱設定資料服務 (WCF Data Services)。 啟用分頁時,摘要中的最後一個項目會包含下一頁資料的連結。 這個連結是包含在 DataServiceQueryContinuation 物件之中。 執行 DataServiceQuery 時,呼叫 QueryOperationResponse 上的 GetContinuation 方法,即可取得下一頁資料的 URI。 傳回的 DataServiceQueryContinuation 物件就能用來載入下一頁的結果。 呼叫 GetContinuation 方法前,您必須列舉查詢結果。 考慮第一次列舉查詢結果時,使用 do…while 迴圈,然後檢查 non-null 下一個連結值。 GetContinuation 方法傳回 null (在 Visual Basic 中為 Nothing) 時,原始查詢不會有其他結果頁面。 下列範例顯示 do…while 迴圈,該迴圈會從 Northwind 範例資料服務載入已分頁的客戶資料。

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

當查詢要求相關的實體與要求的實體集一併以單一回應傳回時,分頁限制可能會影響回應中內嵌包含的巢狀摘要。 例如,在 Northwind 範例資料服務中,針對 Customers 實體集設定分頁限制時,您也可以針對相關 Orders 實體集設定獨立的分頁限制,如下列定義 Northwind 範例資料服務的 Northwind.svc.cs 檔案範例所示。

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

在這種狀況下,您必須為最上層 Customers 和巢狀 Orders 實體摘要兩者實作分頁。 下列範例顯示 while 迴圈,此迴圈用來載入與選取之 Customers 實體相關的 Orders 實體頁面。

While nextOrdersLink IsNot Nothing
    For Each o As Order In c.Orders
        ' Print out the orders.
        Console.WriteLine("\t\tOrderID: {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();
}

如需詳細資訊,請參閱 HOW TO:載入分頁結果 (WCF Data Services)

二進位資料流

WCF Data Services 可讓您存取二進位大型物件 (BLOB) 資料,做為資料流。 資料流會延後二進位資料的載入,直到需要為止,因此用戶端可以更有效地處理這些資料。 為了利用這個功能,資料服務必須實作 IDataServiceStreamProvider 提供者。 如需詳細資訊,請參閱資料流處理提供者 (WCF Data Services)。 啟用資料流時,將會傳回沒有相關二進位資料的實體類型。 在此情況下,您必須使用 DataServiceContext 類別的 GetReadStream 方法,從服務存取二進位資料的資料流。 同樣地,使用 SetSaveStream 方法可加入或變更實體的二進位資料當做資料流。 如需詳細資訊,請參閱使用二進位資料 (WCF Data Services)

另請參閱

概念

查詢資料服務 (WCF Data Services)

其他資源

WCF Data Services 用戶端程式庫