C# 在WebAPI中使用ODataQueryOptions查询特定于域的数据模型

C# 在WebAPI中使用ODataQueryOptions查询特定于域的数据模型,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个基于特定领域数据模型的WebAPI,该模型使用专有数据存储 数据存储有一个SDK,允许通过OData执行典型的检索/过滤操作,如“and”、“or”、“eq”、“ne”和“substring”等功能 我的端点接受ODataQueryOptions其中T=DTO 我可以通过options.filter返回一个 它又包含一个表示$filter的AST的属性 我正在寻找以下方面的指南和示例: 是否有一种最佳/指定的方式来遍历此AST,以便我可以构建相应的特定于域的查询,通过它的SDK向底层数据

我有一个基于特定领域数据模型的WebAPI,该模型使用专有数据存储

数据存储有一个SDK,允许通过OData执行典型的检索/过滤操作,如“and”、“or”、“eq”、“ne”和“substring”等功能

我的端点接受
ODataQueryOptions
其中T=DTO

我可以通过options.filter返回一个

它又包含一个表示
$filter
的AST的属性

我正在寻找以下方面的指南和示例:

  • 是否有一种最佳/指定的方式来遍历此AST,以便我可以构建相应的特定于域的查询,通过它的SDK向底层数据存储发出调用

  • 如果有支持的方法执行上述操作,导航是否会以保留OData运算符优先级的方式导航树

  • 注:

  • 我没有使用WebAPI 2.0

  • 考虑到缺乏适当的指导以及实施过程中的复杂性/工作量,实施
    IQueryable
    不是一个选项


  • 我不知道什么是“最好的”方法,但这里有一种遍历/解析复杂表达式(部分伪代码)的通用方法。这种方法保留了运算符的优先级

    string Expression(inValue)
    {
        //expression can be any of Literal, OR, AND, Equality, Greater Than etc...
        if(inValue is boolean or)
            return BooleanOR(inValue);
        else if(inValue is boolean and)
            return BooleanAND(inValue);
        else if(inValue is equality comparison)
            return Equality(inValue);
        //...etc etc
        else
            return inValue.LiteralValue;
    }
    
    string BooleanOR(inValue)
    {
        return "(" + Expression(inValue.Operand1) + " OR " + Expression(inValue.Operand2) + ")";
    }
    
    string BooleanAND(inValue)
    {
        return "(" + Expression(inValue.Operand1) + " AND " + Expression(inValue.Operand2) + ")";
    }
    
    string Equality(inValue)
    {
        return "(" + Expression(inValue.Operand1) + " = " + Expression(inValue.Operand2) + ")";
    }