【问题标题】:Web API OData v4 $count=true is ignoredWeb API OData v4 $count=true 被忽略
【发布时间】:2017-04-02 08:52:31
【问题描述】:

我开始了一个新的 Web api 项目,并且正在使用最新的 OData 库,但我无法让 $count 像以前 3.0 版本的 odota 库那样工作。无论我尝试过什么,我总是取回 json 对象数组,而不会将它包含在一个对象中,该对象应该具有原始未过滤/排序集合中项目总数的计数。

几乎其他一切都按预期工作,我可以使用$filter、$top、$skip 和$orderby。我还没有尝试过其他任何东西(还)。我也尝试返回硬编码的实体列表而不是 DbSet<Company>,但这并没有任何区别。

谁能告诉我我需要做什么才能让它工作?贝娄是回购所需的所有代码,我只显示相关代码(至少我认为是相关代码)。如果还有什么我需要展示的,请询问。

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

测试网址

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

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    我没有继承自正确的控制器类型,我应该继承自 ODataController 而不是 ApiController。

    public sealed class CompanyController : ODataController
    

    这样做解决了我面临的问题和奇怪的副作用,比如属性未被忽略。

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2016-05-13
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多