我已经设置了一个Web API 2.2 ODataController,这样我就可以手动处理我的OData选项(即没有[EnableQuery]和/或使用ODataQueryOptions参数)。 但是我遇到了一个看起来像个bug的东西。 给出以下代码:

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),另一个用$ choices / $ expands构建SelectExpandClause以分配给Request.ODataProperties()。SelectExpandClause。

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

有人能给我一些见解吗? 也许只有我缺少的东西。

===============>>#1 票数:5 已采纳

(将上面的评论移到答案上)

因为你真正从ApplyTo获得的东西(一旦你添加$ select或$ expand)就是

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

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

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

  ask by Xorcist translate from so

未解决问题?本站智能推荐:

4回复

OData v4函数始终返回404

试图从OData v3迁移到OData v4 。 为什么我在尝试使用OData函数时会继续获得404 ? Web API配置: C#代码: 从$ metadata返回的XML: 如您所见,它位于架构/ OData模型中......但以下查询不起作用: 我也
4回复

oData v4简单来说函数和操作是什么?

在oData 4.0中经常引用动作和函数。 我无法得到他们是什么以及他们是如何不同的。 功能是否与我们在任何编程语言中的功能相同? 什么是行动? 以及两者是如何不同的。 谢谢你的帮助。
3回复

当站点具有全局AuthorizeAttribute时,ASP.NET允许匿名访问OData $ metadata

我有一个ASP.NET OData站点,该站点在WebApiConfig文件中具有以下内容: 这将强制所有调用者在调用任何控制器之前进行身份验证。 不幸的是,这也迫使用户认证访问“ $ metadata” URL。 我需要全局强制对所有控制器访问进行身份验证,同时还允许匿名访问“
1回复

在Web API 2.2上使用带有Odata v4.0的$ select和$ expand时出错

我有一个为OData v4配置的web api 2.2。 我希望按ID返回用户,并且仅包含用户所属的用户组ID。 当我这样做 我收到这个错误 URI中指定的查询无效。 在select子句中找到具有多个导航属性的路径。 请重新设置您的查询,以便每个级别的select或ex
2回复

Web API 2 Odata V4 PATCH返回404

我有这个控制器: GET有效,我得到结果,甚至可以对它们进行排序。 但是当我执行PATCH请求时,出现404错误,即PATCH请求: 请求网址: http:// localhost:61240 / odata / InvRecipientAutoInvoice(Recipient
1回复

Web API OData v4枚举本地化

我正在尝试将Kendo网格与OData v4控制器一起使用。 发送回一个非常简单的LogEntry类,上面有一个LogLevel枚举,OData不想本地化枚举的名称。 这是我的WebApiConfig。 当OData将其吐出供Kendo网格显示时,是否有任何方法可以使其使用某种
1回复

带有OData v4的Web Api 2-绑定函数返回复杂对象

在这个简单的示例中,我尝试从Web Api 2 + OData v4服务中将对象序列化为JSON。 控制器具有绑定函数Test,该函数返回annon数组。 对象。 Edm是使用以下代码构建的: 当我向服务发出请求时(例如http:// localhost:9010 / oda
3回复

OData V4的Web Api无法与HasKey一起使用

我将Web API 2.2用于odata v4,以下是模型: 下面是WebApiConfig.cs代码: 到现在为止,一切正常。 但是,如果我从用户角色定义中删除了[Key]。 并使用代码: 当我在User上查询时,我总是得到告诉UserRoles没有键定义的错误。
1回复

OData V4 $扩展嵌套$ filter和$ orderby - 在扩展中结合$ filter和$ orderby

我目前有一个OData V4服务,具有以下型号。 “类别” - “代码” 对于每个类别,可以有许多代码。 我需要$扩展代码,$ filter,其中Active = true,然后$ orderby Codes.Description。 目前以下工作正常无需订购。 o
2回复

OData V4客户端添加子实体

我有一个父级(订单)和一个子级(OrderDetail),其中数据库中已经存在Order,数据库中也存在OrderDetail。 我真正想做的就是添加另一个与Order绑定的OrderDetail记录。 我走了好几条路,我什至不确定什么是正确的路。 让我们假设它们之间的导航已经起作