[水煮 ASP.NET Web API2 方法論](12-3)OData 查詢

来源:http://www.cnblogs.com/shuizhucode/archive/2016/11/22/6087772.html
-Advertisement-
Play Games

問題 Web API 怎麼支持通用的 OData 系統查詢項,例如 $select 或 $filter。 解決方案 為了在 Web API 中啟用查詢項,我們需要在 Action 上使用 EnableQueryAttribute。 如果 Action 沒有返回集合,而是返回單個對象的實例,調用端仍然 ...


問題

Web API 怎麼支持通用的 OData 系統查詢項,例如 $select 或 $filter。

 

解決方案

為了在 Web API 中啟用查詢項,我們需要在 Action 上使用 EnableQueryAttribute。

如果 Action 沒有返回集合,而是返回單個對象的實例,調用端仍然可以使用 $expand 和 $select 兩個查詢語句,要達到這個目的,我們必須將返回對象包裝在 SingleResult<T> 中。集合和單個對象實例作為返回值的例子如訂單 12-7 所示

清單 12-7. 在兩個路由上啟用查詢語句

 1     public class PlayersController : ODataController
 2 
 3     {
 4 
 5         private readonly PlayersContext playersDbContext = new PlayersContext();
 6 
 7         [EnableQuery]
 8 
 9         public IQueryable<Player> GetAllPlayers()
10 
11         {
12 
13             Return playersDbContext;
14 
15         }
16 
17         [EnableQuery]
18 
19         public SingleResult<Player> GetSinglePlayers(int key)
20 
21         {
22 
23             return SingleResult.Create(playersDbContext.Where(x => x.Id == key).AsQueryable());
24 
25         }
26 
27     }

 

工作原理

OData 查詢選項是被定義在 OData 規範中,如,查詢字元串的參數控制的是返回資源的數量和順序。ASP.NET Web API 幾乎支持所有的標準查詢項:

  • $expand:允許響應給客戶端的信息包含關聯資源(導航屬性)
  • $select:限制返回的屬性
  • $filter:過濾 Api 暴露出來的資源
  • $count:獲取集合中實體的總數
  • $orderby:指定集合的排序 key
  • $skip:獲取集合跳過的數量
  • $top:限制集合返回集合的數量
  • $format:請求特定的響應格式

唯一不支持的是 $search 查詢參數。

 

小提示 可以查看 OData 4.0 支持的完整的文檔地址:http://docs.oasis-open.org/OData/new-in-OData/v4.0/cn01/new-in-OData-v4.0-cn01.html

查詢項是在 ASP.NET Web API 中被 ODataQueryOption 類所描述的。EnableQueryAttribute 的工作方式實際是非常簡單的。因為他是 Action 的 Filter,在 OnActionExecuted 方法中會獲取 Action 的響應,並轉換 HttpContent 為ObjectContent<T>。然後根據 HttpRequest 基於客戶端的參數構造 ODataQueryOptions 實例,並返回相應的響應給客戶端。如果響應是集合的話,可以響應客戶端所有的查詢項。如果響應不是集合,就會通過 ObjectContent 包裝成 SingleResult<T>。這些時候,$expand 和 $select 都是可用的。

不使用 EnableQueryAttribute,也可以使用 ODataQueryOptions,他是可以接受 Action 的參數的。這種方式是通過自定義 HttpParameterBinding 類型的 ODataQueryParameterBinding 來支持的。我們也可以使用 ODataQueryOptions 實例中的信息手動執行相關查詢。

在 Web API 中我們不需要完全掌握 OData 就可以體會到查詢項給我們帶來的便利。就算不是基於 ODataCotrollers,只要 Action 上使用了 EnableQueryAttribute 屬性標簽,我們還是可以在 Web API 上使用一些基礎查詢項,例如,$top,$skip,$select。

 

代碼演示

在 Controller 的 Action 上使用 EnableQueryAttribute,這樣的請求就可以使用 OData 查詢項,如清單 12-7

  • Host/Plays(1)$select=Name,Team:使用 Player 實體的 Id 進行過濾,僅僅返回 Name 和 Team 兩個屬性。這個例子的響應,如清單 12-8.

 

清單 12-8. 從 OData 的 Web API 查詢響應例子

{
  "@OData.context":"http://localhost:43539/OData/$metadata#Players(Name,Team)/$entity","Name":"Name1","Team":"Team"
} 
  • Host/Players?skip=1&$top=2:忽略集合中第一個實體,然後再剩下的實體中獲取兩個返回(可以理解為分頁的第二頁數據,每頁大小是 2)。具體響應,如清單 12-9 所示。

清單 12-9. 從 OData 的 Web API 查詢響應例子

{
  "@OData.context":"http://localhost:43539/OData/$metadata#Players","value":[
    {
      "Id":1,"Name":"Name1","Team":"Team"
    },{
      "Id":2,"Name":"Name11","Team":"Team"
    }
  ]
}
  • Host/Players?$format=application/json;OData.metadata=full&$filter=Team%20eq%20%27Team2%27:請求條件你為 Team 屬性值為 Whales,以 json 格式返回 ,包含 OData 元數據的所有信息,包含類型和導航鏈接。具體響應結果,如清單 12-10 所示
{
  "@OData.context":"http://localhost:43539/OData/$metadata#Players","value":[
    {
      "@OData.type":"#BoiledCode.WebApi.Recipe.ODataDemo.Models.Player","@OData.id":"http://localhost:43539/OData/Players(3)","@OData.editLink":"http://localhost:43539/OData/Players(3)","Id":3,"Name":"Name2","Team":"Team2"
    },{
      "@OData.type":"#BoiledCode.WebApi.Recipe.ODataDemo.Models.Player","@OData.id":"http://localhost:43539/OData/Players(4)","@OData.editLink":"http://localhost:43539/OData/Players(4)","Id":4,"Name":"Name21","Team":"Team2"
    }
  ]
}

 

就像上面提到的,我們可以通過在 Action 方法中使用 ODataQueryOptions 參數,來手動的實現詢項。ODataQueryParameterBinding 會幫我完成將對象傳入到 Action 的操作,這樣我們就可以 Action 內部提取 OData 相關的查詢項了。 

清單 12-11. 在 Action 中使用 ODataQueryOptions

 1         public IQueryable<Player> GetAllPlayers(ODataQueryOptions queryOptions)
 2 
 3         {
 4 
 5             // 客戶端傳入的 top 和 skip
 6 
 7             var filtered = db.Players.Skip(queryOptions.Skip.Value);
 8 
 9             if (queryOptions.Top.Value > 0)
10 
11             {
12 
13                 filtered = filtered.Take(queryOptions.Top.Value);
14 
15             }
16 
17             return filtered.AsQueryable();
18 
19         }

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 命令是一種可執行文件,包括:關鍵字 參數。 1.顯示目錄中的文件 2.查詢工作目錄 3.改變文件許可權mask 4.以root身份執行命令 5.查看幫助 6.創建文件 7.複製文件 8.移動文件 9.刪除文件 10.創建目錄 11.刪除空目錄 12.改變文件訪問許可權 13.改變文件的擁有者 14.改變 ...
  • 新的2016MBP終於發佈了,作為把蘋果電腦裝WIN使用的人,等候很久之後,終於可以行動了。 1、之前的2013款Macbook Air 2013年之前一直用的是DELL電腦,由於DELL鍵盤左下角的Fn鍵在Ctrl鍵的右側,已經慣了多年,所以一直對於ThinkPad和Apple這樣Fn和Ctrl鍵... ...
  • spi子系統之驅動SSD1306 OLED 接觸Linux之前,曾以為讀源碼可以更快的學習軟體,於是前幾個博客都是一邊讀源碼一邊添加註釋,甚至精讀到每一行代碼,實際上效果並不理想,看過之後就忘記了。主要原因是沒理解透程式架構,各個模塊之間的關係,如何聯繫在一起,再加上沒有實例驗證。後來逐漸發現,理解 ...
  • 情況描述: 當安裝某些軟體後,磁碟根目錄中多出了msdia80.dll文件,該文件顯示為2006年12月1日,884KB。 原因: 當使用64位操作系統時,在電腦上安裝 Microsoft Visual C++ 2005 可再發行組件時, Msdia80.dll文件被安裝在啟動驅動器的根文件夾中。 ...
  • 【大型網站技術實踐】初級篇:藉助Nginx搭建反向代理伺服器(轉) 出處:http://edisonchou.cnblogs.com/ 一、反向代理:Web伺服器的“經紀人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將 ...
  • seL4之hello 2旅途 2016/11/19 13:15:38 If you like my blog, please buy me a cup of coffee. 回顧上周 seL4運行環境搭建. 完成 的運行. 補充上周 1.微內核與巨集內核有什麼不同? 微內核——用戶態提供OS服務,一般 ...
  • 在開發中,由於某些需求,我們可能需要做一些平移,縮放,旋轉甚至三維變換,所以我來講講在UWP中這些變換的實現方法。 一、 二維變換: 二維變換用到的是RenderTransform a、TranslateTransform,平移: 屬性:X,Y我相信大家都知道怎麼用,這裡就不講廢話了 b、Rotat ...
  • 項目相關的快捷鍵 Ctrl + Shift + B = 生成項目 Ctrl + Alt + L = 顯示Solution Explorer(解決方案資源管理器) Shift + Alt+ C = 添加新類 Shift + Alt + A = 添加新項目到項目 編輯相關的鍵盤快捷鍵 Ctrl + En... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...