gpt4 book ai didi

asp.net-core - OData,Net5 : How to implement $count when controllers return entities of multiple types

转载 作者:行者123 更新时间:2023-12-02 18:28:25 28 4
gpt4 key购买 nike

我将 OData 添加到 .Net5 中现有的大型 API,其中每个 Controller 中的操作方法返回不同的类型(例如 OrganizationFull、OrganizationList 等)

这是有效的,只是响应不包含 OData 元数据,例如 $count。因此,当消费者调用/api/OrganizationList?$count=true 时,它​​不会获得计数。

我知道要获取此元数据,我必须添加 EDM 模型,如下所示:

// Startup.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddOData(opt => opt.Select().Filter().Count().SetMaxTop(10).AddRouteComponents("odata", GetEdmModel()))


IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();

odataBuilder.EntitySet<OrganizationFull>(nameof(Organization));
odataBuilder.EntitySet<OrganizationList>(nameof(Organization)); // throws
return odataBuilder.GetEdmModel();
}


这里我指定了 2 个 EntitySet,一个对应从 OrganizationController 返回的每种实体类型。

但是,这会引发异常“实体集‘Organization’已经配置了不同的EntityType (‘OrganizationFull’)。”。如果我删除 OrganizationList 的 EntitySet,当我到达列表端点时,我会得到 404。

如何让端点返回 $count 元数据,同时保留我的 API(从一个 Controller 返回多种实体类型)?

或者,有没有办法从 OData 基础设施获取操作方法中的计数?在这种情况下,我可以在响应 header 中返回它。

最佳答案

经过一番挖掘,我找到了一种从 OData 库中获取计数的方法,无需为其提供 EDM 模型,也无需更改 API 的 JSON 响应(即,无需添加 OData 元数据)。

这适用于 Microsoft.AspNetCore.OData 版本 8.0.1。

事实证明,该库公开的 EnableQueryAttribute 过滤器的 OnActionExecuted 方法将计数与 http 上下文相关联。您可以重写此方法,检索计数,然后用它执行您想要的操作(例如创建响应 header ):

public partial class EnableQueryWithCountAttribute: EnableQueryAttribute
{
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);

HttpContext context = actionExecutedContext.HttpContext;

// TotalCount will be null if 1) Count is not enabled during startup; and 2) if
// $count=true is not used in the url.

long? count = context.Request.ODataFeature().TotalCount;
if (count.HasValue)
{
// Here you could do something with count,
// such as adding it to the response using a response header.
}
}
}

然后,您可以使用新属性而不是 EnableQuery 来装饰端点。例如:

[EnableQueryWithCount]
public virtual ActionResult<IQueryable<T>> Get()
{
...
}

关于asp.net-core - OData,Net5 : How to implement $count when controllers return entities of multiple types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69776758/

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