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设置为服务,以控制最大值。