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

C# web api odata:防止使用OR运算符查询某些字段,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我有一个web api后端项目,我想在该项目上提供以下功能: 如果对象属性与OR运算符一起使用,则禁止在查询中使用该属性 例如: 这是我的暴露对象: public class Session { public string Name {get;set;} public string Number {get;set;} } 因此api消费者可以进行这些查询: mydomain/api/data/sessions?$filter=Name eq 'name1' mydomain/api/dat

我有一个web api后端项目,我想在该项目上提供以下功能:

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

例如:

这是我的暴露对象:

public class Session
{
 public string Name {get;set;}
 public string Number {get;set;}
}
因此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'
但是,如果他执行以下查询:

mydomain/api/data/sessions?$filter=Name eq 'name1'or Number eq 'number1'
他必须被拒绝,因为数字字段不能与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.
    }
}
[RoutePrefix(“api/目录”)]
公共类SessionController:ApiController
{
[HttpGet]
[路线(“会议”)]
[CheckQueryAttribute]
公共IQueryable Get()
{
列表=新列表();
添加(新会话{Name=“Name 1”,Number=“place 1”});
添加(新会话{Name=“Name 2”,Number=“place 2”});
添加(新会话{Name=“Name 3”,Number=“place 3”});
返回列表。AsQueryable();
}
}
公共类CheckQueryAttribute:EnableQueryAttribute
{
公共覆盖IQueryable ApplyQuery(IQueryable queryable、ODataQueryOptions queryOptions)
{
//我想在这里解析查询对象,以检查Number属性是否与or运算符组合
//但我不知道怎么做,更重要的是我不确定这是不是正确的方法。
}
}

您最终解决了这个问题吗?这可能会有所帮助,因为您似乎想分析整个语句,然后打电话决定是否允许您可能想查看的过滤器