如何使用Entity SetController进行自定义分页

时间:2013-05-07 16:20:02

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

我正在尝试使用EntitySetController实现自定义分页。

public class MyController : EntitySetController<Poco, int>
{
    public IQueryable<Poco> Get()
    {
        var result = _myBusinessLogic.Search(QueryOptions.Top.Value);
        return result.AsQueryable()
    }
 }

我想我错过了一些东西,因为看起来控制器试图将分页应用于已经只返回一页的Search方法的结果。我怎样才能阻止它这样做并自己应用分页?

看起来我可以直接从ODataController继承并实现:

public IEnumerable<Poco> Get(ODataQueryOptions odataQueryOptions)

但我想知道我是否可以继续使用EntitySetController,以便编写更少的管道代码。

我想坚持使用OData格式,而不是返回PageResult<>

1 个答案:

答案 0 :(得分:1)

您只能使用ODataQueryOptions完全控制查询,或者让框架使用QueryableAttribute为您完全处理它。不幸的是,没有中间地带。

所以,我认为做ODataController是解决这个问题的正确方法。

那就是说,我可以建议一个暂时可行的肮脏的解决方法。请注意,这依赖于可能/将会改变并打破您的内部实现。

public class MyController : EntitySetController<Poco, int>
{
    public IQueryable<Poco> Get()
    {
        var result = _myBusinessLogic.Search(QueryOptions.Top.Value);
        RemoveQueryString(Request, "$top");
        return result.AsQueryable()
    }    

    // This method relies that code that looks for query strings uses the extension
    // method Request.GetQueryNameValuePairs that relies on cached implementation to 
    // not parse request uri again and again.
    public static void RemoveQueryString(HttpRequestMessage request, string name)
    {
        request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = request.GetQueryNameValuePairs().Where(kvp => kvp.Key != name);
    }
}