2013-05-07 71 views
0

我正在嘗試使用EntitySetController實現自定義分頁。如何使用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

可以使用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); 
    } 
}