【问题标题】:How to add absent OData Query Option inside the controller action如何在控制器操作中添加不存在的 OData 查询选项
【发布时间】:2019-09-17 04:36:38
【问题描述】:

我的 OData EDM 中有 Product 实体,具有 GUID 键属性,但如果不使用 $orderby,我想强制使用另一个属性 Number 对 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】:

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

    动作代码现在如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2015-10-28
      • 2020-05-16
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多