2013-03-15 4 views
25

Я использую из коробки ValuesController в приложении Web API ASP.NETWeb API OData Inlinecount не работает

public class ValuesController : ApiController 
{ 
    // GET api/values 
    [Queryable(PageSize = 1)] 
    public IQueryable<string> Get() 
    { 
     return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable(); 
    } 
} 

Когда я get http://localhost/api/values?$inlinecount=allpages

Это ответ

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<string>value1</string> 
</ArrayOfString> 

Я раскопан config.EnableQuerySupport();

Фильтровать, отсортировать ng работать нормально.

Если я пытаюсь get http://localhost/api/values?$inlinecount=XXXXX я получаю исключение, так что кажется, приложение Web API знает о inlinecount

<Message>The query specified in the URI is not valid.</Message> 
<ExceptionMessage>'xxx' is not a valid value for $inlinecount.</ExceptionMessage> 
<ExceptionType>Microsoft.Data.OData.ODataException</ExceptionType> 

Я определенно есть пакет Microsoft.AspNet.WebApi.OData - вот выход пакета Консоль менеджера

PM> Install-Package Microsoft.AspNet.WebApi.OData 
Attempting to resolve dependency 'Microsoft.Net.Http (= 2.0.20710.0 && < 2.1)'. 
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (= 4.0.20710.0 && < 4.1)'. 
Attempting to resolve dependency 'Newtonsoft.Json (= 4.5.6)'. 
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (= 4.0.20710.0 && < 4.1)'. 
Attempting to resolve dependency 'Microsoft.Data.OData (= 5.2.0 && < 5.3.0)'. 
Attempting to resolve dependency 'System.Spatial (= 5.2.0)'. 
Attempting to resolve dependency 'Microsoft.Data.Edm (= 5.2.0)'. 
'Microsoft.AspNet.WebApi.OData 4.0.0' already installed. 
WebServicesProject already has a reference to 'Microsoft.AspNet.WebApi.OData 4.0.0'. 

Любые предложения?

ответ

26

Большой вопрос.

$ inlinecount из коробки работает только при отправке ответов OData. Причина этого в том, что OData определяет специальные поля в данных, которые XML и JSON не определяют. Таким образом, в OData ответ может выглядеть следующим образом:

{ 
    "odata.metadata":"http://localhost:12345/odata/$metadata#Customers", 
    "odata.count":"4", 
    "value":[ ... ] 
} 

Обратите внимание на обертку со свойством «odata.count». Это отличается от того, как выписывают данные форматы XML и JSON по умолчанию, потому что у них нет оберток для этой дополнительной информации. Таким образом, другие форматы по умолчанию неизменны.

Теперь у вас есть несколько вариантов:

Вы можете выбрать, чтобы использовать формат OData. Для этого, вы хотите, чтобы следовать инструкциям в этом блоге:

http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx

Вы также можете выбрать, чтобы вместо того, чтобы вернуть PageResult<T>. Это выглядит следующим образом:

public PageResult<Customer> Get(ODataQueryOptions<Customer> queryOptions) 
{ 
    IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable()); 
    return new PageResult<Customer>(results as IEnumerable<Customer>, Request.GetNextPageLink(), Request.GetInlineCount()); 
} 

Это должно работать нормально для OData, JSON и XML, добавив объект-оболочку для XML и JSON, который может включать графу и следующую ссылку страницы.

+1

От чтения документов MS на этом http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options это похоже на должен работать из коробки, например, для фильтрации и сортировки? – tom

+3

Документ ошибочен в этом случае. Разница в том, что фильтрация не требует изменения «формы» данных, но добавление количества строк и ссылки на следующую страницу. Поэтому фильтрация работает из коробки для других форматировщиков, но $ inlinecount этого не делает. –

+0

Взгляните на breezejs.com. Последняя версия работает со всем синтаксисом MS OData, и все поддерживают inlinecount, выбирают и расширяют. –

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