如何使用asp.net OData协议将分页专门应用于作为JSON一部分的列表

时间:2012-11-19 10:12:12

标签: c# asp.net asp.net-web-api odata

下面是我控制器中的get方法。它返回一个包含布尔值“success”,字符串“message”和列表的JSON。如何使用OData查询列表?一般来说,如果返回类型是IQueryable,那么以下将使用api / Category / all?$ top = 5 to获得前5名....但我应该怎么做?

// Get all Categories
    [HttpGet]
    [ActionName("all")]
    [Queryable]
    public HttpResponseMessage GetCategoryList()
    {          

        var categoryList = this.Repository.GetCategories().AsQueryable<Category>();

        return Request.CreateResponse(HttpStatusCode.OK, new ResponseMessage<IQueryable<Category>> { success = true, data = categoryList });

    }

public class ResponseMessage<T>  where T: class
{
    public string message;

    public bool success;

    public T data;
}

2 个答案:

答案 0 :(得分:1)

根据您提供的详细信息,解决方案似乎正在使用 odata格式。我的意思是,这里没有使用支持你提到的查询语法的ODATA提供程序。因此,您必须自己处理分页方案。

有一个即将推出的库,Microsoft ASP.NET Web API OData 0.2.0-alpha,它将提供该功能,但它仍处于alpha状态。

您可以通过将操作参数命名为与查询字符串ID相同来将查询字符串绑定到操作参数。因此,通过将操作修改为GetCategoryList(int top),您将能够获取参数中top参数的值。你还必须处理下一个X的场景。

答案 1 :(得分:1)

您可以使用ODataQueryOptions<T>来解决问题。您的代码如下所示:

[HttpGet]
[ActionName("all")]
public HttpResponseMessage GetCategoryList(ODataQueryOptions<Category> options)
{          

    var categoryList = this.Repository.GetCategories().AsQueryable<Category>();
    categoryList = options.ApplyTo(categoryList) as IQueryable<Category>;

    return Request.CreateResponse(HttpStatusCode.OK, new ResponseMessage<IQueryable<Category>> { success = true, data = categoryList });

}

ODataQueryOptions应该与QueryableAttribute一样。