gpt4 book ai didi

c# - Web API OData v4 $count=true 被忽略

转载 作者:太空狗 更新时间:2023-10-30 01:31:36 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

我没有继承自正确的 Controller 类型,我应该继承自 ODataController 而不是 ApiController

public sealed class CompanyController : ODataController

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

关于c# - Web API OData v4 $count=true 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40678185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com