2016-11-18 5 views
3

Ich habe ein neues Web-API-Projekt gestartet und verwende die neuesten OData-Bibliotheken, aber ich kann die $count nicht wie in der vorherigen Version 3.0 der odota-Bibliotheken verwenden. Egal, was ich versucht habe, ich bekomme immer das Array von JSON-Objekten zurück, ohne dass es in einem Objekt enthalten ist, das die Anzahl der Elemente in der ursprünglichen ungefilterten/sortierten Sammlung haben sollte.

Fast alles andere funktioniert wie erwartet, kann ich $filter, $top, $skip und $orderby verwenden. Ich habe (noch) nichts anderes probiert. Ich habe auch versucht, eine fest codierte Liste von Entitäten anstelle der DbSet<Company> zurückzugeben, aber das machte keinen Unterschied.

Kann mir jemand sagen, was ich tun muss, damit das funktioniert? Nachstehend ist der Code, der für ein Repo benötigt wird, ich zeige nur den Code des Offenbaren (zumindest was ich für den relevanten Code halte). Wenn es noch etwas zu zeigen gibt, fragen Sie bitte.

packages.config

<package id="Microsoft.AspNet.WebApi" version="5.2.3" /> 
<package id="Microsoft.AspNet.OData" version="6.0.0" /> 
<package id="Microsoft.OData.Core" version="7.0.0" /> 
<package id="Microsoft.OData.Edm" version="7.0.0" /> 

Firma Modell

public sealed class Company { 
    public int CompanyId { get; set; } 
    public string Name { get; set; } 
    public CompanyState State { get; set; } // a simple int enum 
    public DateTime CreatedOn { get; set; } 
} 

WebApiConfig.cs

public static void Register(HttpConfiguration config) { 
    config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 
    config.MapODataServiceRoute("odata", "odata", GetModel()); 
} 
public static IEdmModel GetModel() { 
    var builder = new ODataConventionModelBuilder(); 
    builder.EnableLowerCamelCase(); 
    var companySet = builder.EntitySet<Model.Company>("Company").EntityType.HasKey(x => x.CompanyId); 
    return builder.GetEdmModel(); 
} 

CompanyController.cs

[ODataRoutePrefix("Company")] 
public sealed class CompanyController : ApiController { 
    private DbContext context; 
    public CompanyController(DbContext context) { 
     this.context = context; 
    } 

    [EnableQuery] // also tried with [EnableQuery(MaxNodeCount = 50, MaxTop = 100, PageSize = 100)] 
    [ODataRoute] 
    [HttpGet] 
    public IHttpActionResult Get() 
    { 
     return Ok(context.Set<Company>()); 
    } 
} 

Test-URL

http://localhost:35743/odata/Company/?$count=true&$top=3 

Ergebnisse

[{"companyId":2,"name":"Company 1","state":1,"createdOn":"2016-11-12T21:10:41"} 
,{"companyId":3,"name":"Mars","state":0,"createdOn":"2016-11-12T21:10:41"} 
,{"companyId":4,"name":"Veronica","state":0,"createdOn":"2016-11-12T21:10:41"}] 

Erwartete Ergebnisse:

{ 
    "@odata.context":"some local url", 
    "@odata.count": 9, 
    "value": [{"companyId":2,"name":"Company 1","state":1,"createdOn":"2016-11-12T21:10:41"} 
    ,{"companyId":3,"name":"Mars","state":0,"createdOn":"2016-11-12T21:10:41"} 
    ,{"companyId":4,"name":"Veronica","state":0,"createdOn":"2016-11-12T21:10:41"}] 
} 

Antwort

0

Ich erbte nicht von der richtigen Controller-Typ, ich sollte von ODataController und nicht ApiController geerbt haben.

Dadurch löste dieses Problem und seltsame Nebenwirkungen Ich war wie Eigenschaften nicht ignoriert werden.