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

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

场景:

  • 大型数据库视图,大约40百万行(MySQL)
  • 数据库第一EDMX(entity framework6.1.0)
  • EntitySetController.Get()将数据提供给客户端(WebApi 2.1)
  • Excel 2013消耗OData提要

我的服务器端代码必须考虑到后面的巨大数据,所以我用[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/SerieValues (这会正确获得视图中的前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提供服务器错误,并没有数据显示。

我怎样才能使它工作?

是的,当从OData服务获得数据时,Excel将忽略分页。 既然你设置MaxSkip = 5000,当Excel试图获得第5001条logging时,它将失败。 那么你的预期行为是什么? 如果要控制回报的数量,可以在查询中结合$ skip和$ top,并将MaxSkip和MaxTop设置为服务,以控制最大值。