Ошибка разбора строки фильтра OData - PullRequest
0 голосов
/ 01 марта 2020

Я использую OData для запроса и фильтрации набора результатов, который имеет Priority Низкого или Среднего. После прочтения документации OData я почти уверен, что делаю это правильно со следующим GET-запросом:

https://localhost:5001/api/v1/BusinessProcesses/ProcessWithResults?$filter=Priority%20IN%20(%27Low%27,%20%27Medium%27)

Который в моем коде Angular выглядит так:

`${this.rootUrl}BusinessProcesses/ProcessWithResults?$filter=priority IN ('Low', 'Medium')`;

Однако я получаю следующую ошибку:

Unable to perform operation 'IN'
Value cannot be null. (Parameter 'member')

Забавно, что я даже не вижу, где моя конечная точка GET Web API ссылается на свойство или объект member.

Ошибка в методе ниже при попытке разобрать фильтр в строке Expression<Func<T, bool>> predicateExpression = language.Parse<T>(filter);:

public void Parse(string queryString)
        {
            if (!string.IsNullOrEmpty(queryString))
            {
                var queryStrings = HttpUtility.ParseQueryString(queryString);
                if (queryStrings.HasKeys() && queryStrings.AllKeys.Contains("$filter"))
                {
                    string filter = queryStrings["$filter"];
                    var language = new ODataFilterLanguage();
                    Expression<Func<T, bool>> predicateExpression = language.Parse<T>(filter);
                    Filter = predicateExpression.Compile();
                }
                if (queryStrings.HasKeys() && queryStrings.AllKeys.Contains("$top"))
                {
                    string top = queryStrings["$top"];
                    ParseTop(top);
                }
                if (queryStrings.HasKeys() && queryStrings.AllKeys.Contains("$skip"))
                {
                    string skip = queryStrings["$skip"];
                    ParseSkip(skip);
                }

                if (queryStrings.HasKeys() && queryStrings.AllKeys.Contains("$orderby"))
                {
                    string orderby = queryStrings["$orderby"];
                    OrderByClause<T> orderbyClause = new OrderByClause<T>();
                    orderbyClause.Parse(orderby);
                    Sort = orderbyClause.RootExpression;
                    SortDirection = orderbyClause.Direction;
                }
            }
        }

Я очень плохо знаком с OData и не уверен, в чем проблема. Может кто-нибудь помочь мне решить проблему? Я не смог найти ничего похожего на мою проблему. Единственное, что я могу сказать, это то, что у меня есть рабочий пример, который выглядит следующим образом:

https://localhost:5001/api/v1/BusinessProcesses/ProcessWithResults?$filter=status%20eq%20%27%27%20or%20status%20eq%20%27%27%20or%20status%20eq%20%27%27%20or%20status%20eq%20%27%27%20or%20priority%20eq%20%27Low%27%20or%20priority%20eq%20%27Medium%27%20or%20priority%20eq%20%27%27%20or%20ownerName%20eq%20%27%27

В Angular коде это выглядит так:

this.rootUrl + `BusinessProcesses/ProcessWithResults?$filter=status eq '${obj.status[0] != undefined ? obj.status[0].name : ''}' or status eq '${obj.status[1] != undefined ? obj.status[1].name : ''}' or status eq '${obj.status[2] != undefined ? obj.status[2].name : ''}' or status eq '${obj.status[3] != undefined ? obj.status[3].name : ''}'`;
    url += ` or priority eq '${obj.priority[0] != undefined ? obj.priority[0].name : ''}' or priority eq '${obj.priority[1] != undefined ? obj.priority[1].name : ''}' or priority eq '${obj.priority[2] != undefined ? obj.priority[2].name : ''}' or ownerName eq ${ownerFilterUrl}`;

1 Ответ

0 голосов
/ 01 марта 2020

IN может не поддерживаться в используемой вами библиотеке OData.

Не упоминается как фильтр в ASP. NET Ссылка на WEB API 2 . Он был добавлен в OData v4.0.1 в соответствии с документами.

Альтернативой будет:

$filter=(priority eq 'Low') or (priority eq 'Medium')
...