0

我正在尝试使用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<>

4

1 回答 1

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);
    }
}
于 2013-05-07T18:24:27.013 回答