如何限制 WebAPI 中的 OData 结果

How limit OData results in a WebAPI

我目前正在开发一个应用程序,该应用程序使用 Web API 到存储在数据库中的 return 数据。

现在,我需要能够过滤结果,所以 OData 到请求,这样我就可以在查询字符串中构建整个过滤器。

这是 OData 的配置:

private static void ConfigureOData(HttpConfiguration config)
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<GenericArticle>("GenericArticle");
    config.MapODataServiceRoute(routeName: "ODataRoute", routePrefix: "OData", model: builder.GetEdmModel());

    // Defines the configuration for OData.
    var queryAttribute = new QueryableAttribute
    {
        MaxTop = Convert.ToInt32(ConfigurationManager.AppSettings["OData:MaxTop"]),
        PageSize = 2
    };

    config.EnableQuerySupport(queryAttribute);
}

正在从 WebApiConfig.cs 文件中调用此方法。

Global.asax 文件确实包含以下代码:

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    GlobalConfiguration.Configuration.EnsureInitialized();

    UpdateDatabaseToLatestVersion();
}

我用来查询数据的控制器如下:

 [EnableQuery]
 public IQueryable<GenericArticle> Get()
 {
     var data = UnitOfWork.GenericArticlesRepository.Entities;

     return data;
 }

因此,该方法标有 EnableQuery 属性,控制器也继承自 ODataController

现在,我可以查询一些包含数百万条记录的表,当然,我什至不希望 GetAll 找到通往数据库的路径。

因此,我认为在 WebApiConfig 文件中,以下代码就足够了:

var queryAttribute = new QueryableAttribute
{
    MaxTop = Convert.ToInt32(ConfigurationManager.AppSettings["OData:MaxTop"]),
    PageSize = 2
};

但是,这并不限制结果,但是当我请求 url 时它会抛出一个错误,其中的 take 过滤器大于此处定义的 MaxTop 值。

有没有办法确保,即使我在没有任何过滤器参数的情况下请求 url,结果也将仅包含启用分页的前 'x' 条记录?

如果您想限制记录的获取数量,请尝试使用服务器分页选项来过滤记录。

检查这个 link - http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#server-paging