2013-06-23 57 views
1

我想在我的EntitySetController派生控制器類中能夠擁有額外的GetXYZ方法。例如:EntitySetController中的其他GetXYZ方法

[HttpGet] 
[Queryable] 
     public string GetAirportsWithinRadius(int airportId, int radius) 
     { 

      var resultAirports = GetAirportsWithinRadius2(airportId, radius); 

      return resultAirports;    
     } 

這是我的配置:

ActionConfiguration getAirportsWithinRadius = modelBuilder.Entity<Airport>().Collection.Action("GetAirportsWithinRadius"); 
     getAirportsWithinRadius.Parameter<int>("airportId"); 
     getAirportsWithinRadius.Parameter<int>("radius"); 
     getAirportsWithinRadius.ReturnsCollectionFromEntitySet<Airport>("Airports"); 

我想這個動作是可組合就像默認獲取可查詢的行動,但這將是支持所有的OData替代參數,但另外還有airportId和radius。這將首先通過半徑搜索過濾機場(我知道該怎麼做 - 與問題無關),然後返回Queryable,以便可以通過odata params進一步過濾。

我讀過的一切都表示這將是一個odata動作,因此必須是POST,但Get也是一個動作,那是一個GET,那麼爲什麼不允許擴展的getter使用額外的參數呢?我錯過了什麼嗎?我如何完成我想完成的任務?

我就從一個Ajax客戶端因此稱之爲: GET /的OData /機場$ inlinecount =所有頁& $頂部= 25 & airportId = 2112 &半徑= 50

,而不是一個普通的OData GET :? GET /的OData /機場$ inlinecount =所有頁& $頂部= 25

感謝

編輯: 我現在明白了,這是一個OData的 「功能」,它是理解過程作爲未來功能的考慮。讓我們忘記第二個這個的odata意思。它本質上是一個返回一個Queryable的WebApi HttpGet,對嗎?所以,只要我不關心這個「函數」的元數據廣告,我怎樣才能確保它是一個ODataController內的可路由的HttpGet形式的路徑透視圖? ODataController需要MapODataRoute,並且可以使用額外的MapHttpRoutes額外添加非odata路由嗎? 我問這個,因爲在我看來,我應該能夠,但我所有的嘗試都失敗了(試圖通過提琴手擊中HttpGet)。我無法找到使用其他非odata GET擴展ODataController的示例。有人可以幫助我理解是否和如何這可以用您正在尋找的OData功能,目前還不支持開箱即用的例子?:

[Queryable] 
     public IQueryable<Airport> Get() 
     { 
      return db.Airports; 
     } 
    [HttpGet] 
    [Queryable] 
      public string GetAirportsWithinRadius(int airportId, int radius) 
      { 

       var resultAirports = GetAirportsWithinRadius2(airportId, radius); 

       return resultAirports;    
      } 

回答

2

來完成。我們在這裏有一個問題。你可以對它投票。

http://aspnetwebstack.codeplex.com/workitem/881

+0

Arrgg :)我添加了我的投票。這非常重要,因爲語義上有許多商業邏輯擴展到了香草Get。任何方式我現在可以解決這個問題,並完成我想要的?我想我可以編寫一個aditional apicontroller ... – t316

+0

您應該從ODataController派生出來,以便OData相關格式化程序進入畫面。但即使我們有這個解決方法,問題是您是否想要在元數據文檔上公開此操作/函數。由於Web API僅支持動作,如果您將其指定爲動作,則元數據文檔會將其顯示爲動作,讀取文檔的客戶端會感到困惑並執行POST。我猜你可以避免完全在元數據文件上顯示。 –

+0

好的 - 這是我想要做的:然後我想使用方便的EntitySetController或ODataController並添加一個名爲GetAirportsWithinRadius(int airportId,int radius)的附加HttpGet。我想使用這種方法只是作爲一個香草webapi控制器的行動方法,我不需要任何元數據(即。正式的odata功能發現 - 因爲它還不存在)。但我需要手動定義一個路線,以允許它從say fiddler中調用。除了MapODataRoute配置之外,有沒有一種方法可以爲此操作添加其他MapHttpRoute配置? – t316