2016-02-21 2 views
0

У меня возникла проблема с WebApi и OData. Медленно перемещая API и ... теперь кажется, что структура переупорядочивает результаты.Результаты переупорядочения WebApi?

Следующий код:

[EnableQuery(PageSize = 100, MaxTop = 1000, AllowedQueryOptions = AllowedQueryOptions.All)] 
    [ODataRoute] 
    public IEnumerable<Reflexo.Api.GrdJob> Get(ODataQueryOptions options) { 
     var nodes = Repository.GrdJob 
      .Include(x=>x.Cluster) 
      .OrderByDescending(x => x.Id) 
      .Select(x => new Reflexo.Api.GrdJob() { 
       Id = x.Id, 
       Identity = x.Code, 
      }).AsQueryable(); 
     nodes = (IQueryable<Reflexo.Api.GrdJob>)options.ApplyTo(nodes); 
     var retval = nodes.ToArray(); 
     return nodes; 
    } 

как simlple, как он получает. Сравнивая результаты в отладчике с тем, что я вижу на экране, вызывая метод ... результаты имеют другой порядок.

Обратите внимание, что я сравниваю поля id id стороны (id) обоих JSON, которые я вижу в браузере, и поля в массиве с именем retval. Я наложил искусственный заказ по умолчанию, который также попадает в SQL (проверено) и array (checked).

Только JSON показывает результаты в другом порядке.

Я что-то не хватает?

+0

Отвечает ли это на ваш вопрос вообще, [Опция запроса OData вверх: данные, подлежащие сортировке по первому ключу) (http://peterkellner.net/2010/03/31/odata-wcfdataservice-top-orderby-default- Сортировать/)? Похоже, что есть некоторые типы поведения, которые относятся к передаче в '$ top = x'. – Igor

+0

Не совсем. Забавно, я не вижу разумного порядка в результате (у которого больше полей). И я вижу порядок в массиве, который выходит из моей функции. – TomTom

+0

Странно, я хватаюсь за соломинку здесь, но: как насчет того, чтобы вернуть его с помощью 'AsQueryable()' вместо 'ToArray' (если он уже не является« AsQueryable() », просто закомментируйте строку все вместе). Помимо этого вы можете подталкивать бремя сортировки к клиенту с помощью '$ orderby'. – Igor

ответ

2

Знайте, что EnableQueryAttribute собирается выполнить ODataQueryOptions.ApplyTo с использованием набора параметров по умолчанию. (См. Источник метода EnableQueryAttribute.ApplyQuery.) Попробуйте удалить атрибут.

+0

Почти ответ - вы совершенно правы.Есть ли пример, как справиться с этим без EnableQueryAttribute? Я не уверен, что он делает, но если я удалю это, я получу ожидаемый результат. Тем не менее, запрос optins - «Множество»;) Реализация их вручную вручную будет сложной задачей. – TomTom

+0

@TomTom - он означает просто удалить этот атрибут, вот и все. Вы можете сохранить существующий ApplyTo, который применяет фильтры OData, orderby, paging и т. Д. Поэтому сохраняйте все то же самое, просто удалите этот атрибут и не нужно ничего делать «вручную». – Igor

+0

Да, но это означает, что я могу сделать много вещей вручную. DEFAULT и максимальные значения, с одной стороны. Attbiute позволяет мне много контроля, которого просто «Применить» не имеет. – TomTom

0

Спасибо другим участникам этого сообщения. Я столкнулся с той же проблемой, описанной выше, и мне удалось отключить сортировку по умолчанию OData, добавив EnsureStableOrdering = false к моему [EnableQuery()] атрибуту.