我正在尝试使用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<>
答案 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);
}
}