2013-03-15 8 views
25
arbeiten

ich das aus der Box bin mit ValuesController in einer ASP.NET Web-API-AnwendungWeb API OData Inlinecount nicht

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

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

Dies ist die Antwort

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

Ich habe unkommentierte config.EnableQuerySupport();

Filterung, sorti ng funktionieren gut.

Wenn ich get http://localhost/api/values?$inlinecount=XXXXX versuchen erhalte ich eine Ausnahme, so scheint es, die Web-API-Anwendung kennt inlinecount über

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

ich auf jeden Fall das Paket Microsoft.AspNet.WebApi.OData haben - hier die Ausgabe des Pakets ist Manager Konsole

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

Irgendwelche Vorschläge?

Antwort

26

Große Frage.

$ inlinecount funktioniert nur, wenn Sie OData-Antworten zurücksenden. Der Grund dafür ist, dass OData spezielle Felder in den Daten definiert, die XML und JSON nicht definieren. So in OData eine Antwort könnte wie folgt aussehen:

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

Hinweis den Wrapper mit der "odata.count" Eigenschaft. Dies unterscheidet sich von der Art und Weise, wie die standardmäßigen XML- und JSON-Formatierer Daten ausschreiben, da sie keine Wrapper für diese zusätzlichen Informationen haben. So sind andere Formatierer standardmäßig unverändert.

Jetzt haben Sie mehrere Möglichkeiten:

Sie wählen könnte das OData-Format zu verwenden. Dazu sollten Sie die Anweisungen in diesem Blog-Post folgen:

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

Sie könnten auch einen PageResult<T> stattdessen zurückkehren wollen. Das sieht wie folgt aus:

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

Dies sollte für OData, JSON gut funktionieren, und XML durch ein Wrapper-Objekt für XML und JSON hinzufügen, die den Grafen und die nächste Seite Link enthalten.

+1

Aus dem Lesen der MS-Dokumente auf dieser http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/support-odata-query-options, klingt es wie es sollte aus der Box funktionieren, wie Filtern und Sortieren? – tom

+3

Das Dokument ist in diesem Fall falsch. Der Unterschied besteht darin, dass die Filterung nicht die "Form" der Daten ändern muss, sondern eine Inline-Zählung und eine Verknüpfung der nächsten Seite. Die Filterung funktioniert also für andere Formatierer sofort, $ inlinecount hingegen nicht. –

+0

Werfen Sie einen Blick auf breezejs.com. Die neueste Version arbeitet mit der MS OData-Syntax und unterstützt inlinecount, select und expand. –

Verwandte Themen