我有一个工作(简化)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开源... –
山姆。你真棒!如果你把答案放在答案中,我可以接受它。非常感谢。像魅力一样工作。 –