【发布时间】:2016-02-07 22:42:49
【问题描述】:
我有一个使用以下方法的工作(简化)ODataController。
public class MyTypeController : ODataController
{
[HttpGet]
[EnableQuery]
[ODataRoute("myTypes")]
public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
{
return _repo.myResultsAsQueryable();
}
}
我希望能够从服务器调用此方法,为此我需要实例化一个需要 ODataQueryContext 的 ODataQueryOptions。
有一些示例说明如何执行此操作(例如 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);
}
【问题讨论】:
-
github.com/OData/WebApi 中有很多测试用例可以参考。比如ODataQueryContext,可以参考:github.com/OData/WebApi/blob/master/OData/test/UnitTest/…
-
谢谢 Sam,我会试试看的。不习惯 MS 有开源...
-
山姆。你真棒!如果你把它放在答案中,我可以接受。非常感谢。像魅力一样工作。
标签: c# .net odata asp.net-web-api2