@ Xaphann Вы можете расширить EnableQueryAttribute
следующим образом:
public class ExtendedEnableQueryAttribute : EnableQueryAttribute
{
public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
{
// ... second check in the if statement might be overkill - abundance of caution?
if (queryOptions.Filter != null && queryOptions.Request.Query.ContainsKey("$filter"))
{
var stringValuesDict = new Dictionary<string, StringValues>();
foreach(var kvPair in queryOptions.Request.Query.Where(d => !d.Key.Equals("$filter")))
{
// This way the new StringValues instances are owned exclusively by substitute query collection
var values = new List<string>();
foreach(var value in kvPair.Value)
{
values.Add(value);
}
stringValuesDict.Add(kvPair.Key, new StringValues(values.ToArray()));
}
// Substitute the $filter option
stringValuesDict.Add("$filter", new StringValues("ID eq 202"));
// Substitute the request query collection
queryOptions.Request.Query = new QueryCollection(stringValuesDict);
queryOptions = new ODataQueryOptions(queryOptions.Context, queryOptions.Request);
}
return base.ApplyQuery(queryable, queryOptions);
}
}
Затем вы можете приступить к применению этого расширенного атрибута к действию вашего контроллера. Я проверил его практически, и, похоже, он работал для такого выражения:
?$filter=ID eq 201&$orderby=Name&$select=Name
Если этот подход работает для вас, я бы посоветовал провести более подробное тестирование и, возможно, также написать несколько тестов для проверки поведения