gpt4 book ai didi

c# - 如何实例化 ODataQueryOptions

转载 作者:太空狗 更新时间:2023-10-29 23:21:28 24 4
gpt4 key购买 nike

我有一个可用的(简化的)ODataController,方法如下。

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

我希望能够从服务器调用此方法,为此我需要实例化一个 ODataQueryOptions,它需要一个 ODataQueryContext

有如何执行此操作的示例(例如 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);
}

最佳答案

当然。 ODataPath 是一个 ODataPathSegment 列表,它应该跟在 OData Uri spec 之后.

在Web API OData中,很容易实例化一个ODataPath,例如:

IEdmModel model = GetEdmModel(); 
IEdmEntitySet entitySet = model.EntityContainer.FindEntitySet(setName);
ODataPath path = new ODataPath(new EntitySetPathSegment(entitySet));

上面的 path 遵循 OData 规范,它具有如下的 odata 模板:

~/entityset

更多测试用例(代码)可见here

关于c# - 如何实例化 ODataQueryOptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33572659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com