練習 - 使用 Language-integrated Query (LINQ) 列舉項目

已完成

雖然應用程式已經符合所有需求,但仍有一個可以進行的變更。 C# 開發人員會使用語言整合查詢 (LINQ) 語法,對資料集合執行查詢。 Azure Cosmos DB for NoSQL 的 .NET SDK 隨附內建機制,可使用 LINQ 方法語法來建置查詢。

目前有兩個主要需求:

  1. 使用 LINQ 語法建置新的查詢
  2. 將查詢轉換為摘要反覆運算器以取得結果

Illustration of icons indicating data being queried using a LINQ expression.

完成此練習之後,您的查詢現在會使用 LINQ 語法,讓開發人員更輕鬆地繼續維護應用程式。

使用 LINQ 運算式進行查詢

您的小組想要唯一的查詢,不論類別為何,都會傳回容器內的所有產品。 回想一下,我們使用 type 屬性來分隔類別項目與個別產品項目。 在這裡,我們將使用 LINQ 方法語法建立跨分割區查詢。

提示

由於我們正在跨多個類別進行查詢,這也會讓我們的查詢跨分割區。 此查詢可能會使用比範圍設定為單一邏輯分割區索引鍵值的查詢更多的 RU。

  1. 再開啟 Program.cs 檔案最後一次。

  2. 使用 GetItemLinqQueryable 方法建立新的 LINQ 查詢。

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. 使用 WhereOrderBy 方法建置 LINQ 運算式,並將運算式儲存在新變數中。

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. 使用 IOrderedQueryable<>.ToFeedIterator 方法,從 LINQ 運算式取得摘要反覆運算器。

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. 將訊息輸出至主控台。

    Console.WriteLine($"[Start LINQ query]");
    
  6. 儲存 Program.cs 檔案。

分頁 LINQ 查詢結果

由於我們正在查詢多個邏輯分割區,因此即使邏輯分割區沒有任何相符的結果,我們也必須確定傳回所有結果。 例如,頭盔類別沒有任何相符的產品。 如果我們未傳回所有可能的頁面,當應用程式看到頭盔類別的結果空白頁面時,可能會不小心停止。 在這裡,您會再次使用 C# 中的 whileforeach 迴圈來逐一查看所有結果頁面。 程式碼應該類似於您先前使用摘要反覆運算器的方式。

  1. Program.cs 中建立逐一查看的 while 迴圈,直到摘要反覆運算器沒有更多頁面為止。

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. while 迴圈內,取得新的結果頁面。

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. 仍在 while 迴圈內,輸出目前頁面的要求費用。

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. 仍在 while 迴圈內,建立新的 foreach 迴圈來逐一查看頁面的項目。

    foreach (Product item in page)
    {
    }
    
  5. foreach 迴圈內,將個別項目寫入主控台。

    Console.WriteLine($"[Returned item]:\t{item}");
    
  6. 儲存 Program.cs 檔案。

檢查您的工作

您的應用程式現在會使用 LINQ 來建置開發人員小組原本理解的跨分割區查詢。 在這裡,您會最後一次執行應用程式,以確保所有查詢都會傳回您預期的結果。

  1. 在終端中執行 .NET 應用程式:

    dotnet run
    
  2. 觀察執行應用程式的輸出。 輸出應該會與此處範例相符:

    [Start LINQ query]
    [Page RU charge]:       3
    [Returned item]:        Product { Id = 6e3b7275-57d4-4418-914d-14d1baca0979, CategoryId = gear-camp-tents, Type = Product, Name = Nimbolo Tent, Price = 330, Archived = False, Quantity = 35 }
    [Returned item]:        Product { Id = e8dddee4-9f43-4d15-9b08-0d7f36adcac8, CategoryId = gear-camp-tents, Type = Product, Name = Cirroa Tent, Price = 490, Archived = False, Quantity = 15 }
    [Returned item]:        Product { Id = e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa, CategoryId = gear-camp-tents, Type = Product, Name = Kuloar Tent, Price = 530, Archived = False, Quantity = 8 }
    

    提示

    此範例輸出中顯示的 RU 可能會因您的輸出而有所不同。