ASP.NET Web API 心得筆記 (5) 分頁和查詢(Paging and Querying)

Open Data Protocal (OData) 指定查詢字串參數讓 Client 能使用它去排序與過濾結果。

Web API 提供以下內建支援 OData 查詢參數:


Web API 提供支援 OData 查詢參數
查詢參數說明範例
$filter選擇與布林運算式相符的項目http://localhost:port/api/contacts?$filter=substringof(Name, 'Ed') eq true
$orderby指定的屬性來排序結果http://localhost:port/api/contacts?$orderby=Name
$skip跳過前 n 筆元素http://localhost:port/api/contacts?$skip=2
$top傳回前 n 筆元素http://localhost:port/api/contacts?$top=10

$top 如果與 $orderby 一起使用,會先排序,然後再取得前 n 筆元素以回傳。

例如,以下的 URI 會回傳前 3 筆連絡人資料,而且使用 name 排序過。

http://localhost:port/api/contacts?$top=3&orderby=name

要支援這些查詢選項,簡單的從 GET 方法中回去 IQueryable 型別

例如,我們在 "ASP.NET Web API 心得筆記 (3) CRUD 操作" 裡 controller 有一個方法是回傳 IEnumerable(Of Contact) 泛型集合


Function GetAllContacts() As IEnumerable(Of Contact)
    Return _repository.GetAllContact()
End Function

要支援 OData 查詢參數,需修改回傳的集合為 IQueryable(Of Contact)型別


Function GetAllContacts() As IEnumerable(Of Contact)
    Return _repository.GetAllContact().AsQueryable()
End Function

只需要透過 .AsQueryable() 的幫忙,即可幫我們轉換。

更多 OData 查詢字串參數資訊,請查詢 OData: URI Conventions

4 則留言:

  1. 原來這就是 odata~~~ 來學習了

    回覆刪除
  2. $top 傳回前 n 筆元素 http://localhost:port/api/contacts?$orderby=Name
    後面給的範例 http://localhost:port/api/contacts?$top=10

    回覆刪除
  3. 請問一下,有沒有辦法在不使用$orderby的情況下,保留coding實作的邏輯上想輸出的desc順序。
    例如常常有"新的資料要在上面"的需求,在coding上會這樣做:
    return _repository.GetAllContact().OrderByDescending(c=>c.Id);

    API查詢時不使用ODATA就沒問題。
    一旦使用ODATA後($top或$skip),coding上指定的反向排序,在實際查詢時就會被取代成ASC
    不知道這算不算bug...

    回覆刪除
  4. OData的$orderby可指定 desc,
    例如:$orderby=name desc,這樣就會使用Desc方式回傳。

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。