2016-11-18 5 views
3

Я начал новый проект web-api и использую последние библиотеки OData, но я не могу заставить $count работать так, как это было в предыдущей версии версий библиотек odota. Независимо от того, что я пробовал, я всегда возвращаю массив объектов json, не содержась в объекте, который должен иметь счетчик общего количества элементов в исходной нефильтрованной/отсортированной коллекции.

Почти все остальное работает, как и ожидалось, я могу использовать $filter, $top, $skip и $orderby. Я еще ничего не пробовал (пока). Я также попытался вернуть жесткий кодированный список объектов вместо DbSet<Company>, но это не имело никакого значения.

Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы заставить это работать? Bellow - это весь код, необходимый для репо, я только показываю код revelant (по крайней мере, я думаю, что это соответствующий код). Если есть что-то еще, мне нужно показать, пожалуйста, спросите.

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

Компания Модель

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 

Результаты

[{"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"}] 

Ожидаемые результаты:

{ 
    "@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"}] 
} 

ответ

0

Я не наследовал от правильного типа контроллера, я должен был наследовать от ODataController, а не ApiController.

public sealed class CompanyController : ODataController 

Выполнение этой задачи разрешило эту проблему и нечетные побочные эффекты, с которыми я сталкивался, поскольку свойства не игнорируются.

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

  • Нет связанных вопросов^_^