gpt4 book ai didi

odata - Web API 2.2 - OData v4 ODataQueryOptions.applyTo() 在 $select 或 $expand 存在时返回 null?

转载 作者:行者123 更新时间:2023-12-05 01:00:46 29 4
gpt4 key购买 nike

我已经设置了一个 Web API 2.2 ODataController,以便我可以手动处理我的 OData 选项(即没有 [EnableQuery] 和/或使用 ODataQueryOptions 参数)。但是,我遇到了看起来像错误的情况。鉴于以下代码:

public IHttpActionResult GetEmployees() {
//Get Queryable Item (in this case just an in-memory List made queryable)
IQueryable<Employee> employees = _Employees.AsQueryable();

//Get Requested URI without querystring (there may be other ways of doing this)
String newUri = Request.RequestUri.AbsoluteUri;
if (!String.IsNullOrEmpty(Request.RequestUri.Query)) {
newUri = newUri.Replace(Request.RequestUri.Query, "");
}

//Add custom OData querystring (this is for example purposes)
newUri = String.Format("{0}?$skip={1}&$top={2}", newUri, 1, 1);

//Create new HttpRequestMessage from the updated URI
HttpRequestMessage newRequest = new HttpRequestMessage(Request.Method, newUri);

//Create new ODataQueryContext based off initial request (required to create ODataQueryOptions)
ODataQueryContext newContext = new ODataQueryContext(Request.ODataProperties().Model, typeof(Employee), Request.ODataProperties().Path);

//Create new ODataQueryOptions based off new context and new request
ODataQueryOptions<Employee> newOptions = new ODataQueryOptions<Employee>(newContext, newRequest);

//Apply the new ODataQueryOptions to the Queryable Item
employees = newOptions.ApplyTo(employees) as IQueryable<Employee>;

//Return List (will be serialized by OData formatter)
return Ok(employees.ToList());
}

这 100% 有效,但是添加 $select 或 $expand 这样的:
newUri = String.Format("{0}?$skip={1}&$top={2}&$expand=Projects", newUri, 1, 1);

将从中返回 null
employees = newOptions.ApplyTo(employees) as IQueryable<Employee>;

这迫使我创建两个单独的 ODataQueryOptions,一个应用到 IQueryable(没有任何 $select 或 $expand),另一个只使用 $selects/$expands 来构建 SelectExpandClause 以分配给 Request.ODataProperties().SelectExpandClause。

我只是不明白为什么会发生空返回。此代码背后的核心意图是允许在使用 Entity Framework 以外的 ORM 时更好地控制处理 OData。所以实际上我最终还是会覆盖 applyTo(或者只是自己手动处理表达式树),但是这个特定的例子对我来说仍然是一个错误。

谁能给我一些这方面的见解?也许只是我缺少一些东西。

最佳答案

(将我上面的评论移至答案)

因为你真正从 ApplyTo 得到的(一旦你添加了 $select 或 $expand)是

System.Web.OData.Query.Expressions.SelectExpandBinder.SelectAllAndExpand<Employe‌​e>

当然,它不能转换为 IQueryable,因此为 null。

为什么不添加 EnableQuery 属性,并返回 IQueryable(而不是 ToList)?

关于odata - Web API 2.2 - OData v4 ODataQueryOptions.applyTo() 在 $select 或 $expand 存在时返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102561/

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