OData介紹:是一個查詢和更新數據的Web協議。OData應用了web技術如HTTP、Atom發布協議(AtomPub)和JSON等來提供對不同應用程序,服務 和存儲的信息訪問。除了提供一些基本的操作(像增刪改查),也提供了一些高級的操作類似過濾數據和實體的導航。OData擴展了上述的協議但是不是取代他 們。他可以被XML(ATOM)或者JSON取代但是OData的重要在於它符合REST原則。在某種意義上,它建立在'簡單'的REST HTTP 服務上,並且有着清晰的目標——簡化和標准化我們操作和查詢數據的方式。如果你過去在給你的REST服務創建搜索、過濾、或者分頁API的時候感覺很麻 煩,那么OData將是一個不錯的選擇。
OData好處:通過OData,我們采取不同的方法。取代創建客戶端簽名和參數,我們問了如下的問題:“如果你將數據集作為源處理,並為最頻繁使用的操作定義模式,像查 詢、分頁、排序、新建、刪除和更新,服務接口因該是什么樣子的?” 這也就導致OData的創建。OData解決了上面提到的關鍵服務設計挑戰。
由於Visual Studio 2012里面的 AspNet WebApi 2 OData 中的 AspNet WebApi Client 5.0 依賴於 .Net Framework 4.5 框架,
所以只能去下載,.Net Framework 4.0 版本的 AspNet WebApi OData
AspNet WebApi OData 版本下載地址:http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData.zh-Hans/4.0.30506
程序包管理器,去安裝:
PM> Install-Package Microsoft.AspNet.WebApi.OData -Version 4.0.30506
$filter 用法:
Return all products with category equal to “Toys”. | http://localhost/Products?$filter=Category eq 'Toys' |
Return all products with price less than 10. | http://localhost/Products?$filter=Price lt 10 |
Logical operators: Return all products where price >= 5 and price <= 15. | http://localhost/Products?$filter=Price ge 5 and Price le 15 |
String functions: Return all products with “zz” in the name. | http://localhost/Products?$filter=substringof('zz',Name) |
Date functions: Return all products with ReleaseDate after 2005. | http://localhost/Products?$filter=year(ReleaseDate) gt 2005 |
$orderby 用法:
Sort by price. | http://localhost/Products?$orderby=Price |
Sort by price in descending order (highest to lowest). | http://localhost/Products?$orderby=Price desc |
Sort by category, then sort by price in descending order within categories. | http://localhost/odata/Products?$orderby=Category,Price desc |
PageSize 用法:
[Queryable(PageSize=10)] public IQueryable<Product> Get() { return products.AsQueryable(); } 客戶端點擊鏈接篩選到下一頁,為了讓客戶端得到頁碼,我們必須求出結果集,這個客戶端可以使用$inlinecount的一個叫“allpages”的參數,來得到總條數。
http://localhost/Products?$inlinecount=allpages
這個“allpages”值,就是服務端包含結果集的總數,響應告訴給客戶端: { "odata.metadata":"http://localhost/$metadata#Products", "odata.count":"50", "value":[ { "ID":1,"Name":"Hat","Price":"15","Category":"Apparel" }, { "ID":2,"Name":"Socks","Price":"5","Category":"Apparel" },
] }
//此方法,是用來處理分頁數據查詢,過濾,我們可以很方便靈活的去在客戶端做處理。 public PageResult<Product> Get(ODataQueryOptions<Product> options) { ODataQuerySettings settings = new ODataQuerySettings() { PageSize = 5 }; IQueryable results = options.ApplyTo(_products.AsQueryable(), settings); return new PageResult<Product>( results as IEnumerable<Product>, Request.GetNextPageLink(), Request.GetInlineCount()); }
這里是一個返回Json的例子:
{
"Items": [{"ID":1,"Name":"Hat","Price":"15","Category":"Apparel"},
{"ID":2,"Name":"Socks","Price":"5","Category":"Apparel"},// Others not shown],
"NextPageLink" :"http://localhost/api/values?$inlinecount=allpages&$skip=10",
"Count": 50
}
博客參考學習地址:
http://www.cnblogs.com/cube/p/3484115.html
http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options