如何实例化ODataQueryOptions

问题描述 投票:6回答:2

我使用以下方法工作(简化)ODataController

public class MyTypeController : ODataController
{
  [HttpGet]
  [EnableQuery]
  [ODataRoute("myTypes")]
  public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
  {
    return _repo.myResultsAsQueryable();
  }
}

我希望能够从服务器调用此方法,为此,我需要实例化需要ODataQueryOptionsODataQueryContext

[存在一些有关如何执行此操作的示例(例如herehere),但它们似乎都引用了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);
}
c# .net odata asp.net-web-api2
2个回答
5
投票

当然。 ODataPath是应该跟随OData Uri spec的ODataPathSegment的列表。


0
投票

您的odata控制器正在为您的数据提供HTTP接口,您是否不应该通过HTTP(即使从服务器)访问它呢?这里有一个VS插件来生成odata客户端代码:

© www.soinside.com 2019 - 2024. All rights reserved.