2013-03-15 9 views
25

Używam po wyjęciu z pudełka ValuesController w aplikacji ASP.NET Web APIWeb API OData Inlinecount nie działa

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

Kiedy get http://localhost/api/values?$inlinecount=allpages

Jest to odpowiedź

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

Mam odkomentowane config.EnableQuerySupport();

Filtrowanie, sortowanie Ng działa dobrze.

Gdy próbuję get http://localhost/api/values?$inlinecount=XXXXX uzyskać wyjątek, więc wydaje się, że aplikacja Web API wie o 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> 

pewno mieć pakiet Microsoft.AspNet.WebApi.OData - tutaj jest wyjście z Pakietu Manager Konsola

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'. 

Wszelkie sugestie?

Odpowiedz

26

Świetne pytanie.

$ inlinecount po wyjęciu z pudełka działa tylko wtedy, gdy odsyłasz odpowiedzi OData. Powodem tego jest to, że OData definiuje specjalne pola danych, których XML i JSON nie definiują. Tak więc w OData odpowiedź może wyglądać następująco:

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

Informacja na opakowaniu z właściwością "odata.count". Różni się to od sposobu, w jaki domyślne formaty XML i JSON zapisują dane, ponieważ nie zawierają dodatkowych informacji. Więc inne formatery są domyślnie niezmienione.

Teraz masz kilka opcji:

Można zdecydować się na stosowanie formatu OData. Do tego, będziemy chcieli, aby postępować zgodnie z instrukcjami w tym blogu:

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

Można również wybrać zamiast zwrócić PageResult<T>. Wygląda to tak:

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

ten powinien działać dobrze dla OData, JSON i XML dodając obiekt otoki dla XML i JSON, które mogą obejmować policzyć i następnego linku strony.

+1

Odczytując dokumenty MS na temat tego http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options, brzmi to jak powinien działać po wyjęciu z pudełka, jak filtrowanie i sortowanie? – tom

+3

Dokument jest w tym przypadku błędny. Różnica polega na tym, że filtrowanie nie musi zmieniać "kształtu" danych, ale dodaje do tego liczbę inline i link do następnej strony. Więc filtrowanie działa po wyjęciu z pudełka dla innych formaterów, ale $ inlinecount nie. –

+0

Spójrz na breezejs.com. Najnowsza wersja działa ze wszystkimi składnikami MS OData i wszystkimi obsługiwanymi wersjami inlinecount, select i expand. –