Open Data Protocal (OData) 指定查詢字串參數讓 Client 能使用它去排序與過濾結果。
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。
原來這就是 odata~~~ 來學習了
回覆刪除$top 傳回前 n 筆元素 http://localhost:port/api/contacts?$orderby=Name
回覆刪除後面給的範例 http://localhost:port/api/contacts?$top=10
請問一下,有沒有辦法在不使用$orderby的情況下,保留coding實作的邏輯上想輸出的desc順序。
回覆刪除例如常常有"新的資料要在上面"的需求,在coding上會這樣做:
return _repository.GetAllContact().OrderByDescending(c=>c.Id);
API查詢時不使用ODATA就沒問題。
一旦使用ODATA後($top或$skip),coding上指定的反向排序,在實際查詢時就會被取代成ASC
不知道這算不算bug...
OData的$orderby可指定 desc,
回覆刪除例如:$orderby=name desc,這樣就會使用Desc方式回傳。