OData Exception The limit of '0' for Top query has been exceeded
Asked Answered
S

5

23

I am using OData Web API for Version 4, when I try to query OData web Api using $top parameter, it return me following exception message.

The query specified in the URI is not valid. The limit of '0' for Top query has been exceeded. The value from the incoming request is '10'

I am using Apache Ignite dotNet LINQ as data source instead of Entity Framework, my OData controller action method is as follows:

[EnableQuery]
public IQueryable<Productioncurvepnl> GetProductioncurvepnl()
{
    Console.WriteLine("Starting query to ignite");
    var q = AIgniteClient.IgniteClient.Instance.ProductionCurvePnLCache.AsCacheQueryable().Select(c => c.Value);
    return q;
}
Sung answered 21/9, 2016 at 17:8 Comment(2)
Please also include the full URL you are using in the question.Dionysiac
localhost:9000/odata/Productioncurvepnl?$top=10Sung
A
71

Since Web API OData V6.0.0 you need to enable query options to have this work. This can be done globally in the WebApiConfig.Register(HttpConfiguration config)

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

or directly on your models, for fine grained configuration:

[Page(MaxTop = 100)]
public class Products

If you're using Model Bound Fluent APIs and cannot add attributes, you'll need to append the query options. For example .Page(50, 50):

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

More details can be found in the documentation

Apish answered 13/10, 2016 at 12:35 Comment(3)
for config.Select() to work add using System.Web.OData.Extensions; hope helps someone.Creeper
Annotating the class worked for me, but the way you enabled query options did not. I used config.AddODataQueryFilter(new EnableQueryAttribute { AllowedQueryOptions = AllowedQueryOptions.All });Mclemore
(N.B. I am using HttpSelfHostConfiguration which is probably why)Mclemore
E
5

Adding below in Startup.cs works for me

config.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
Exegete answered 5/10, 2018 at 16:30 Comment(0)
D
2

Based on the returned error message the problem most likely is that the MaxTop is not defined. You can do that using the EnableQueryAttribute on your method like so (change the value as you see fit), I used a value of 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;
}

See EnableQueryAttribute for more details.

Dionysiac answered 21/9, 2016 at 17:23 Comment(0)
V
1

For me [EnableQuery (Max Top = 100)] not working, but [Queryable] working fine. [EnableQuery (Max Top = 100)] should work but don't know why it's not working. Someone knows then please let me know. But for now I am using [Queryable].

Venter answered 13/10, 2016 at 11:6 Comment(3)
Queryable is deprecated, I have posted an answer with two approaches. Either configuring it globally, or per modelApish
Neither of the two methods work if you've applied restrictions to the EntityType, for example: builder.EntitySet<AccountRecordDto>("Accounts").EntityType.Expand(1, "Transactions").Count(); In this case, I needed to add .Page(50,50) to the EntityType.Aubine
@Apish neither work for me with asp core which there is no WebApiConfig.Register(HttpConfiguration config)Orthographize
S
0

I had the same problem and I resolved it by set setting 'SetMaxTop' property in my .Net 6 Odata Middleware :

builder
   .Services
   .AddControllers(mvcoptions => mvcoptions.EnableEndpointRouting = false)
   .AddOData(options => options.Select().Filter().Count().OrderBy().Expand().SetMaxTop(1000));
Scrub answered 13/2, 2023 at 1:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.