我希望能够修改控制器内的过滤器,然后根据更改的过滤器返回数据.
因此,我在服务器端有一个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 …