web api odata:防止使用 OR 运算符查询某些字段

use*_*476 5 c# odata asp.net-web-api

我有一个 Web api 后端项目,我想在其中引入以下功能:

如果对象属性与 OR 运算符一起使用,则阻止在查询中使用该对象属性。

例子 :

这是我暴露的对象:

public class Session
{
 public string Name {get;set;}
 public string Number {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

因此 api 消费者可以执行这些查询:

mydomain/api/data/sessions?$filter=Name eq 'name1'
mydomain/api/data/sessions?$filter=Number eq 'number1'
mydomain/api/data/sessions?$filter=Name eq 'name1'and Number eq 'number1'
Run Code Online (Sandbox Code Playgroud)

但是,如果他执行以下查询:

mydomain/api/data/sessions?$filter=Name eq 'name1'or Number eq 'number1'
Run Code Online (Sandbox Code Playgroud)

他必须被拒绝,因为 Number 字段无法组合为 OR 运算符。实际上他可以执行此查询,但我正在寻找一种正确的方法来拒绝此查询。我正在考虑重写 oData 的 EnableQueryAttribute ,更准确地说是它的方法:

[RoutePrefix("api/directory")]
public class SessionController : ApiController
{
    [HttpGet]
    [Route("sessions")]
    [CheckQueryAttribute]
    public IQueryable<Session> Get()
    {
        List<Session> list = new List<Session>();
        list.Add(new Session { Name = "name 1", Number = "place 1" });
        list.Add(new Session { Name = "name 2", Number = "place 2" });
        list.Add(new Session { Name = "name 3", Number = "place 3" });
        return list.AsQueryable();
    }
}

public class CheckQueryAttribute : EnableQueryAttribute
{
    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
    {
        // I am thinking to parse the query object here to check if the Number property is combined with an or operator
        // but I don't know how to do it, and more important I am not sure if it's the right way.
    }
}
Run Code Online (Sandbox Code Playgroud)