我有一個工作(簡化)ODataController
以下方法。如何實例化ODataQueryOptions
public class MyTypeController : ODataController
{
[HttpGet]
[EnableQuery]
[ODataRoute("myTypes")]
public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
{
return _repo.myResultsAsQueryable();
}
}
我想能夠從服務器調用此方法要做到這一點,我需要實例化一個ODataQueryOptions
這需要一個ODataQueryContext
。
有一些如何做到這一點的例子(例如,here和here),但它們似乎都參考了先前版本的OData。構造函數ODataQueryContext當前需要第三個參數(ODataPath
路徑),這在我找不到的任何示例中都未涉及。
編輯: @snow_FFFFFF,這裏的一些背景。我知道我可以簡單地通過HttpClient的消費OData的終點,但我想與IQueryable的直接照你說的互動。
問題是,我正在處理的應用程序允許用戶創建可以保存並由其他用戶隨後調用的過濾器(如複雜的搜索引擎)。從JS客戶端,他們只需通過id查找過濾器,然後使用應用於查詢字符串的過濾器對OData端點發出查詢。這在客戶端非常有效,但我希望能夠在服務器端做類似的事情。
這是我想要做的,但我如何實例化ODataPath參數?
public IQueryable<MyType> FilterMyTypes(int filterID)
{
// lookup filter by filterID from db...
filter = "$filter=Status eq 1"; // for example...
ODataPath path = // but how can I get the path!!!
new ODataQueryContext(edmModel, typeof(MyType), path);
var uri = new HttpRequestMessage(HttpMethod.Get, "http://localhost:56339/mytypes?" + filter);
var opts = new ODataQueryOptions<MyType>(ctx, uri);
var results = new MyTypeController().GetMyTypes(opts);
}
這樣做的另一個應用是如下支持動態分組:
[HttpGet]
[Route("myTypes/{filterID:int}/groupby/{groupByFieldName}")]
public IHttpActionResult GroupMyTypes(int filterID, string groupByFieldName)
{
// For example: get all Active MyTypes and group by AssignedToUserID...
// Get the results of the filter as IQueryable...
var results = FilterMyTypes(filterID);
// group on groupByFieldName
var grouped = results.GroupBy(x => GetPropertyValue(x,groupByFieldName));
// select the groupByFieldName and the count
var transformedResults = grouped.Select(g => new { g.Key, Count = g.Count() });
return Ok(transformedResults);
}
在http://github.com/OData/WebApi中,有很多可以引用的測試用例。例如,ODataQueryContext,你可以參考:https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/ODataQueryContextTests.cs#L181- L200 –
謝謝山姆,我會盡力..不習慣MS開源... –
山姆。你真棒!如果你把答案放在答案中,我可以接受它。非常感謝。像魅力一樣工作。 –