Как добавить отсутствующий OData Query Option в действие контроллера - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть Product Сущность в моем EData OData со свойством ключа GUID, но я хочу принудительно отсортировать результаты EntitySet с другим свойством Number, если $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();
}

Проблема в том, что queryOptions.OrderBy только для чтения, и я не могу назначить его.

Есть предложения?Пожалуйста. * * 1013

1 Ответ

0 голосов
/ 30 апреля 2019

В итоге я реализовал атрибут, который наследует от 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);
    }
}

Надеюсь, это кому-нибудь поможет позже,

...