OData 异常已超出 Top 查询的“0”限制

Posted

技术标签:

【中文标题】OData 异常已超出 Top 查询的“0”限制【英文标题】:OData Exception The limit of '0' for Top query has been exceeded 【发布时间】:2017-01-30 01:27:43 【问题描述】:

我正在使用版本 4 的 OData Web API,当我尝试使用 $top 参数查询 OData Web Api 时,它返回以下异常消息。

URI 中指定的查询无效。已超出 Top 查询的“0”限制。传入请求的值为'10'

我使用 Apache Ignite dotNet LINQ 作为数据源而不是实体框架,我的 OData 控制器操作方法如下:

[EnableQuery]
public IQueryable<Productioncurvepnl> GetProductioncurvepnl()

    Console.WriteLine("Starting query to ignite");
    var q = AIgniteClient.IgniteClient.Instance.ProductionCurvePnLCache.AsCacheQueryable().Select(c => c.Value);
    return q;

【问题讨论】:

请同时包含您在问题中使用的完整 URL。 localhost:9000/odata/Productioncurvepnl?$top=10 【参考方案1】:

在 Startup.cs 中添加以下内容对我有用

config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();

【讨论】:

【参考方案2】:

由于Web API OData V6.0.0,您需要启用查询选项才能进行这项工作。 这可以在WebApiConfig.Register(HttpConfiguration config) 中全局完成

config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();

或直接在您的模型上进行细粒度配置:

[Page(MaxTop = 100)]
public class Products

如果您使用Model Bound Fluent APIs 并且无法添加属性,则需要附加查询选项。比如.Page(50, 50)

 builder.EntitySet<AccountRecordDto>("Accounts").EntityType.Expand(1, 
 "Transactions").Count().Page(50, 50);

更多详情请见documentation

【讨论】:

config.Select()工作添加using System.Web.OData.Extensions;希望对某人有所帮助。 注释类对我有用,但您启用查询选项的方式没有。我使用了 config.AddODataQueryFilter(new EnableQueryAttribute AllowedQueryOptions = AllowedQueryOptions.All ); (注:我正在使用 HttpSelfHostConfiguration 这可能就是原因)【参考方案3】:

对我来说 [EnableQuery (Max Top = 100)] 不起作用,但 [Queryable] 工作正常。 [EnableQuery (Max Top = 100)] 应该可以工作,但不知道为什么它不工作。有人知道然后请告诉我。但现在我使用的是 [Queryable]。

【讨论】:

Queryable 已弃用,我用两种方法发布了答案。全局配置,或按模型配置 如果您对 EntityType 应用了限制,这两种方法都不起作用,例如:builder.EntitySet&lt;AccountRecordDto&gt;("Accounts").EntityType.Expand(1, "Transactions").Count(); 在这种情况下,我需要将 .Page(50,50) 添加到 EntityType。 @ogrim 对于没有 WebApiConfig.Register(HttpConfiguration config) 的 asp 核心都不适合我【参考方案4】:

根据返回的错误消息,问题很可能是未定义MaxTop。您可以在您的方法上使用EnableQueryAttribute 来做到这一点,就像这样(根据需要更改值),我使用了 100 的值。

[EnableQuery(MaxTop = 100)]
public IQueryable<Productioncurvepnl> GetProductioncurvepnl()

    Console.WriteLine("Starting query to ignite");
    var q = AIgniteClient.IgniteClient.Instance.ProductionCurvePnLCache.AsCacheQueryable().Select(c => c.Value);
    return q;

更多详情请见EnableQueryAttribute。

【讨论】:

以上是关于OData 异常已超出 Top 查询的“0”限制的主要内容,如果未能解决你的问题,请参考以下文章

多部分正文长度限制超出异常

ASP .NET MVC 4 WebApi:手动处理 OData 查询

Google BigQuery 速率限制 Tableau

Python3:超出资源限制时出现异常或返回代码?

kapt 发生异常:java.lang.OutOfMemoryError: GC 开销限制超出

Scala控制台:OutOfMemoryError:超出GC开销限制