我有一个基于特定于域的数据模型构建的WebAPI,该模型使用专有数据存储。
数据存储有一个SDK,它允许人们可能想要通过OData执行的典型检索/过滤操作,例如'和','或','eq','ne'和诸如'substring'等功能。
我的端点接受ODataQueryOptions<T>
,其中T = DTO。
我可以通过options.Filter获取$filter
的表示形式,返回FilterQueryOption
又包含FilterClause属性,表示$filter
的AST。
我正在寻找指导和示例:
是否有最佳/规定的遍历此AST的方法,以便我可以构建相应的特定于域的查询,以通过它的SDK发出对底层数据存储的调用。
如果支持的方法可以执行上述操作,导航是否会以某种方式导航树以保留OData运算符优先级
注:
我没有使用Web API 2.0
由于缺乏适当的指导以及执行此操作所涉及的复杂性/努力,实施IQueryable
不是一种选择。
答案 0 :(得分:0)
我不知道最好的&#39;方式,但这是我将用于遍历/解析复杂表达式(部分伪代码)的一般方法。这种方法保留了运算符的优先级。
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) + ")";
}