【问题标题】:OData Exception The limit of '0' for Top query has been exceededOData 异常已超出 Top 查询的“0”限制
【发布时间】: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;
}

【问题讨论】:

标签: c# odata ignite asp.net-web-api-odata


【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2022-10-30
      相关资源
      最近更新 更多