强制OData将查询解释为一个实体

时间:2015-11-19 00:39:51

标签: odata asp.net-web-api2

我有一个API控制器,其中包含以下用于检索一个特定对象的方法。输出格式为Json。

[Route("~/api/orders({key:int})", Name = "GetOrder")]
public IHttpActionResult GetOrder([FromODataUri] int key, ODataQueryOptions<Order> queryOptions)

它的工作原理如下。

  1. 从名为baseQuery的实体框架构建基本查询
  2. 使用

    将Odata过滤器应用于基本查询

    queryOptions.ApplyTo(baseQuery.OrderByDescending(f =&gt; f.Id)                                             ,querySettings);

  3. 返回结果IQueryable

  4. 问题是这导致列表包含一个对象(要求的对象)。我想让它返回对象本身,而不是一个包含该对象的列表。

    我尝试将FirstOrDefault()添加到baseQuery但是会导致执行查询,之后无法应用OData过滤器。

1 个答案:

答案 0 :(得分:1)

使用System.Web.Http.SingleResult可以使这项工作

SingleResult.Create(queryable)

示例:

[EnableQuery]
[ODataRoute("Order({orderId})")]
public SingleResult<Order> Get(int orderId)
{
    var result = _myOrders.AsQueryable().Where(mo => mo.ID == orderId);
    return SingleResult.Create(result);
}
由于EnableQuery Attribute,

QueryOptions将在控制器中返回结果后应用。