Я использую 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}`;