ASP.. NET OData v3 vs . Excel 2013:忽略分页

本文关键字:分页 2013 Excel NET OData v3 vs ASP | 更新日期: 2023-09-27 18:10:07

我正在尝试将OData Web Api与Excel 2013集成,但我面临一些麻烦

场景:

  • 拥有~ 4000万行(MySQL)的大数据库视图
  • 基于数据库优先的EDMX (Entity Framework 6.1.0)
  • EntitySetController.Get()向客户端提供数据(WebApi 2.1)
  • Excel 2013使用OData feed

我的服务器端代码必须考虑到背后的巨大数据,所以我用[Queryable(PageSize=50)]

装饰我的Get()
public class SerieValuesController : EntitySetController<SerieValue, int>
{
    #region DB Property
    private EDMWarehouseViewsContainer _DB = null;
    public EDMWarehouseViewsContainer DB
    {
        get
        {
            if (_DB == null)
                _DB = new EDMWarehouseViewsContainer();
            return _DB;
        }
    }
    #endregion
    [Queryable(PageSize=50)]
    public override IQueryable<SerieValue> Get()
    {
        var options = this.QueryOptions;
        IQueryable results = DB.SerieValues;
        if (options.Filter != null)
        {
            results = options.Filter.ApplyTo(results, new ODataQuerySettings());
        }
        if (options.Top != null)
        {
            results = options.Top.ApplyTo(results, new ODataQuerySettings());
        }
        return results as IQueryable<SerieValue>;
    }
    protected override SerieValue GetEntityByKey(int id)
    {
        SerieValue entity = DB.SerieValues.Find(id);
        return entity;
    } 
}

如果我试图在浏览器中获取数据,使用这些url

http://mymachine。lan/odata/serevalvalues(这将正确获取视图中的前50行,以及oData.nextLink节点)

http://mymachine.lan/odata/SerieValues?$skip=50(这将正确获得接下来的50行)

当我尝试从Excel 2013中使用此提要时,它开始自动下载数据,逐页下载,直到内存耗尽。

我把[Queryable]的装饰改成了

[Queryable(PageSize=50, MaxSkip=5000)]

在浏览器中检查后($skip=4999工作,$skip=5000工作,$skip=5001给出错误),我试图在excel中再次下载数据。

不幸的是,Excel停止在5000给出一个服务器错误,没有数据显示。

我怎样才能使它工作?

ASP.. NET OData v3 vs . Excel 2013:忽略分页

是的,当从OData服务获取数据时,Excel将忽略分页。由于设置了MaxSkip=5000,因此当excel试图获取第5001条记录时,它将失败。那么你期望的行为是什么?如果你想控制返回的量,你可以在你的查询中组合$skip和$top,并在服务中设置MaxSkip和MaxTop来控制最大值。