Как мне прочитать значения параметров URL OData в действии C #? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь прочитать значения параметров в C #, которые передаются в запрос odata

В следующем запросе я передаю $ filter и ожидаю прочитать значение фильтра

URL: http://localhost:57097/Lead?$filter=AssignedToID eq 21987 and IsDeleted eq false

Я использую этот код для чтения значения параметра HttpContext.Current.Request.QueryString.Get("$filter");

, и он возвращается как "AssignedToID eq 21987 и IsDeleted eq false"

Но я ожидаю прочитать значение AssignedToID т.е. 21987 и IsDeleted т.е. false

1 Ответ

0 голосов
/ 06 февраля 2019

Шаг 1: чтение параметров из действия контроллера

public IQueryable<_MODELNAME_> Get(ODataQueryOptions<_MODELNAME_> Options)
{

......

}

Шаг 2: чтение BinaryOperatorNode из параметров

var binaryOperator = Options.Filter.FilterClause.Expression as BinaryOperatorNode;
string filters = getWhereClause(binaryOperator);

Шаг 3: Создайте ниже рекурсивную функцию, чтобы найти все значения фильтра

private static string getWhereClause(BinaryOperatorNode node)
{  
    var s = "";
    if (node.Left is SingleValuePropertyAccessNode && node.Right is ConstantNode)
    {
        var property = node.Left as SingleValuePropertyAccessNode ?? node.Right as SingleValuePropertyAccessNode;
        var constant = node.Left as ConstantNode ?? node.Right as ConstantNode;

        if (property != null && property.Property != null && constant != null && constant.Value != null)
        {
            s += $" {property.Property.Name} {getStringValue(node.OperatorKind)} '{constant.Value}' ";
        }
    }
    else
    {
        if (node.Left is BinaryOperatorNode)
            s += getWhereClause(node.Left as BinaryOperatorNode);

        if (node.Right is BinaryOperatorNode)
        {
            s += $" {getStringValue(node.OperatorKind)} ";
            s += getWhereClause(node.Right as BinaryOperatorNode);
        }
    }
    return s;
}
...