0

I've Product Entity in my OData EDM, with a GUID key property, but I want to enforce results of the EntitySet to be sorted with another property Number if $orderby is not used. So I want to be able to use $orderby normally, but in case it is absent, I want to add it inside the controller action to ODataQueryOptions, here is what I reached to so far.

[EnableQuery()]
public IQueryable<Product> Get(ODataQueryOptions<Product> queryOptions)
{
    if (queryOptions.OrderBy == null)
    {
        // do something to add $orderby=Number to queryOptions
    }

    return _ProductRepository.GetAll();
}

The problem here is that queryOptions.OrderBy is read-only and I cannot assign to it.

Any Suggestions? Please.

1 Answers1

0

I ended up implementing an Attribute that inherits from EnableQueryAttribute as proposed in this answer https://stackoverflow.com/a/41933056/236384 by @afshar-mohebbi

The action code now looks like this:

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

The attribute implementation looks like this:

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

Hope this helps somebody later,