2013-04-18 1 views
1

Возможно, мне не хватает чего-то простого, но на основании этого сообщения в блоге: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options это должно работать. У меня есть следующий метод контроллера:ODataQueryOptions не применяется

public virtual IQueryable<DtoAgent> Get(ODataQueryOptions<Agent> options, bool includeInactive = false, bool includeDeleted = false) 
    { 
     IQueryable<Agent> agents = null; 
     if (includeDeleted && includeInactive) 
     { 
      agents = agentRepository.FindAll(); 
     } 
     else if (includeDeleted) 
     { 
      agents = agentRepository.FindBy(a => a.ussiStatus == "A"); 
     } 
     else if (includeInactive) 
     { 
      agents = agentRepository.FindBy(a => !a.IsDeleted); 
     } 
     if (agents == null) 
     { 
      agents = agentRepository.FindByExp(a => a.ussiStatus == "A" && !a.IsDeleted); 
     } 
     options.ApplyTo(agents); 
     return agents.ToDtos<DtoAgent>(); 
    } 

, когда я называю это как ../api/Agent?$top=10 он возвращает все результаты не только 10. Я могу видеть TopQueryOption в параметрах переменной, но это делает как представляется, не применяются. Он работает, если я использую атрибут [Queryable], но верхняя часть применяется после вызова БД, чего я пытаюсь избежать. Я вызываю EnableQuerySupport на глобальном уровне и устанавливаю как пакет Nuget, так и обновление 2012.2. Спасибо за вашу помощь.

ответ

3

Вам не хватает чего-то простого. Когда вы вызываете ApplyTo, он не мутирует IQueryable, он возвращает прикладной запрос. Поэтому вместо этого должно работать что-то вроде этого:

var queryResults = options.ApplyTo(agents) as IQueryable<Agent>; 
return queryResults.ToDtos<DtoAgent>(); 
+0

Я подозревал, что много, большое спасибо Youssef! –

Смежные вопросы