我需要$filter
在.NET Core 2.1 API的服务器端进行修改。我看过这些:
https://entityframework.net/knowledge-base/33660648/odata-v4-modify--filter-on-server-side
修改WebAPI OData QueryOptions.Filter的最佳方法
(和其他几个)
他们都按照以下方式做一些事情:
//Get the URL
var url = queryOptions.Request.RequestUri.AbsoluteUri;
//Then modify the URL
url = url.Replace("$filter=ID%20eq%201", "$filter=ID%20eq%202");
//Apply the URL
return queryOptions.ApplyTo(queryable);
问题是它出现在.NET core中没有RequestUri
。我可以通过多种不同方式获取查询:
var query = originalRequest.QueryString.Value;
//or a foreach loop
var filter = Request.Query;
foreach (var x in filter)
//...
但是,两者QueryString.Value
Request.Query
都给我一个错误“值没有setter”
而且该方法ApplyTo
不在.NET Core中。
在.NET Core中执行此操作的正确方法是什么?我有缺少的包裹吗?
@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
如果这种方法对您有用,我的建议是进行更广泛的测试,也许还编写一些测试以验证行为
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句