使用Web API中的ODataQueryOptions查询特定于域的数据模型

时间:2015-03-10 05:30:31

标签: c# asp.net-web-api

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

数据存储有一个SDK,它允许人们可能想要通过OData执行的典型检索/过滤操作,例如'和','或','eq','ne'和诸如'substring'等功能。

我的端点接受ODataQueryOptions<T>,其中T = DTO。

我可以通过options.Filter获取$filter的表示形式,返回FilterQueryOption

又包含FilterClause属性,表示$filter的AST。

我正在寻找指导和示例:

  1. 是否有最佳/规定的遍历此AST的方法,以便我可以构建相应的特定于域的查询,以通过它的SDK发出对底层数据存储的调用。

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

  3. 注:

    1. 我没有使用Web API 2.0

    2. 由于缺乏适当的指导以及执行此操作所涉及的复杂性/努力,实施IQueryable不是一种选择。

1 个答案:

答案 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) + ")";
}