【发布时间】:2014-08-15 15:56:38
【问题描述】:
我正在尝试将 OData Web Api 与 Excel 2013 集成,但遇到了一些麻烦
场景:
- 约 4000 万行的大型数据库视图 (MySQL)
- 数据库优先的 EDMX(实体框架 6.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 处停止,出现服务器错误,并且没有显示任何数据。
我怎样才能让它工作?
【问题讨论】:
标签: c# asp.net excel asp.net-web-api odata