如何在控制器动作中添加不存在的OData查询选项

时间:2019-04-28 08:19:45

标签: c# asp.net-web-api odata

我在OData EDM中拥有Product个实体,具有一个GUID键属性,但是我想强制将EntitySet的结果与另一个属性Number进行排序,如果{{ 1}}未使用。因此,我希望能够正常使用$orderby,但是如果不存在,我想将其添加到$orderby的控制器动作中,到目前为止,这就是我要达到的目的。

ODataQueryOptions

这里的问题是[EnableQuery()] public IQueryable<Product> Get(ODataQueryOptions<Product> queryOptions) { if (queryOptions.OrderBy == null) { // do something to add $orderby=Number to queryOptions } return _ProductRepository.GetAll(); } 是只读的,我无法分配给它。

有什么建议吗?拜托。

1 个答案:

答案 0 :(得分:0)

我最终实现了一个属性,该属性继承自https://stackoverflow.com/a/41933056/236384的答案@afshar-mohebbi中的EnableQueryAttribute

操作代码现在看起来像这样:

[CustomizedEnableQuery()]
public IQueryable<Product> Get()
{
    return _ProductRepository.GetAll();
}

属性实现如下:

public class CustomizedEnableQueryAttribute : EnableQueryAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var url = actionContext.Request.RequestUri.OriginalString;

        // add $orderby=Number to url
        if (url.ToLower().IndexOf("$orderby") == -1)
        {
            var orderByClause = "$orderby=Number";
            var newUrl = url.IndexOf('?') == -1
                ? $"{url}?{orderByClause}"
                : $"{url}&{orderByClause}";

            actionContext.Request.RequestUri = new Uri(newUrl);
        }

        base.OnActionExecuting(actionContext);
    }
}

希望这对以后有帮助的人