如何在控制器操作中添加缺少的OData Query Option

问题描述 投票:0回答:1

我在我的OData EDM中使用Product实体,具有GUID键属性,但是如果不使用Number,我想强制使用另一个属性$orderby对EntitySet的结果进行排序。所以我希望能够正常使用$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();
}

这里的问题是queryOptions.OrderBy是只读的,我无法分配给它。

有什么建议?请。

c# asp.net-web-api odata
1个回答
0
投票

我最终实现了一个继承自EnableQueryAttribute的属性,正如https://stackoverflow.com/a/41933056/236384在这个答案@afshar-mohebbi中提出的那样

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

[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);
    }
}

希望这对以后的人有所帮助,

© www.soinside.com 2019 - 2024. All rights reserved.