Odata 全局页面大小

问题描述 投票:0回答:2

有人可以解释为什么当客户端查询在其查询中不包含 Count=True 时我的 EnableQueryAttribute 过滤器没有触发吗?我的整个数据集已返回。

public class EnableQueryWithDefaultPageSizeAttribute : EnableQueryAttribute
{
    const int pageSizeDefault = 100;

    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
    {
        int pagesize = pageSizeDefault;
        var result = queryOptions.ApplyTo(queryable, new ODataQuerySettings { PageSize = pagesize });
        return result;
    }
}

以下查询触发过滤器:

https://localhost:5001/api/teams?$count=true

此查询不会触发过滤器:

https://localhost:5001/api/teams

解决这个问题的唯一方法是现在对我的控制器方法进行硬编码:

 [EnableQuery(PageSize = 100)]

我的黄金是拥有一个全局过滤器,可以为任何 Odata API 请求设置页面大小。 我用谷歌搜索并阅读了微软文档,但仍然找不到解决方案。 任何帮助将不胜感激。 我目前正在使用 .net core 6.0 和 AspNetCoreOdata 8.0.6。

c# asp.net-core odata
2个回答
0
投票

您是否尝试过在构造函数中故意设置属性?这样做的另一个好处是仍然允许您覆盖每个端点的默认页面大小。

public class EnableQueryWithDefaultPageSizeAttribute : EnableQueryAttribute
{
    public EnableQueryWithDefaultPageSizeAttribute()
    { 
        this.PageSize = 100;
    }
}

我认为 .Net 5/6 中的问题是分页行为需要从 Edm 中解决,而不是从单个查询中解决,这是 .Net FX 实现的重大更改,当您可以根据每个请求对其进行修改时.


0
投票

如果像我这样的人想在一个地方设置页面限制,而不覆盖 [EnableQuery],请在您的 Edm 模型中使用此方法 -

        const int PageSize = 100;
        private static ODataConventionModelBuilder UsePaging(this ODataConventionModelBuilder modelBuilder)
        {
            foreach (var entitySet in modelBuilder.EntitySets)
            {
                var queryConfiguration = entitySet.EntityType.QueryConfiguration;
                queryConfiguration.SetPageSize(PageSize);
            }

            return modelBuilder;
        }

它将适用于您的所有实体集,即使它们是函数的结果。

如果您也想对复杂类型执行相同的操作,请使用

        private static ODataConventionModelBuilder UseComplexTypesPaging(this ODataConventionModelBuilder modelBuilder)
        {
            foreach (var structuralType in modelBuilder.StructuralTypes)
            {
                var queryConfiguration = structuralType.QueryConfiguration;
                queryConfiguration.SetPageSize(PageSize);
            }

            return modelBuilder;
        }
© www.soinside.com 2019 - 2024. All rights reserved.