相关疑难解决方法(0)

OData V4在服务器端修改$ filter

我希望能够修改控制器内的过滤器,然后根据更改的过滤器返回数据.

因此,我在服务器端有一个ODataQueryOptions参数,我可以用它来查看FilterQueryOption.

我们假设过滤器类似于"$ filter = ID eq -1",但在服务器端,如果我看到ID为"-1",则告诉我用户想要选择所有记录.

我试图将"$ filter = ID eq -1"更改为"$ filter = ID ne -1",这将通过设置Filter.RawValue给我所有,但这是只读的.
我试图创建一个新的FilterQueryOption,但这需要一个ODataQueryContext和一个ODataQueryOptionParser,我无法弄清楚如何创建.

然后我尝试设置Filter = Null,然后设置ApplyTo,当我在控制器中设置断点并在立即窗口上检查时,它似乎有效但是一旦它在控制器上离开GET方法,它就会"恢复"回来到URL中传递的内容.

本文讨论了做一些非常相似的" 修改WebAPI OData QueryOptions.Filter的最佳方法 ",但是一旦它离开控制器GET方法,它就会恢复到URL查询过滤器.

使用示例代码更新

[EnableQuery]
[HttpGet]
public IQueryable<Product> GetProducts(ODataQueryOptions<Product> queryOptions)
{
    if (queryOptions.Filter != null)
    {
        var url = queryOptions.Request.RequestUri.AbsoluteUri;
        string filter = queryOptions.Filter.RawValue;

        url = url.Replace("$filter=ID%20eq%201", "$filter=ID%20eq%202");
        var req = new HttpRequestMessage(HttpMethod.Get, url);

        queryOptions = new ODataQueryOptions<Product>(queryOptions.Context, req);
    }

    IQueryable query = queryOptions.ApplyTo(db.Products.AsQueryable());
    return query as IQueryable<Product>;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码不会返回任何产品,因为URL中的原始查询需要产品1,我将产品1的ID过滤器与产品2交换.
现在,如果我运行SQL事件探查器,我可以看到它添加了类似"选择"的内容*来自产品WHERE ID = 1 AND …

odata asp.net-web-api entity-framework-6 asp.net-web-api2

15
推荐指数
2
解决办法
1万
查看次数