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<AccountRecordDto>("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 查询