我正在尝试将OData Web Api与Excel 2013集成,但我遇到了一些麻烦
情景:
我的服务器端代码必须考虑背后的大量数据,所以我用[Queryable(PageSize=50)]
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;
}
}
如果我尝试使用这些网址在浏览器中获取数据
http://mymachine.lan/odata/SerieValues(这会正确显示视图中的前50行以及oData.nextLink
节点)
http://mymachine.lan/odata/SerieValues?$ skip = 50(这可以正确地获得接下来的50行)
当我尝试从Excel 2013使用此Feed时,它会逐页开始自动下载数据,直到内存崩溃。
所以我改变了我的[Queryable]
装饰
[Queryable(PageSize=50, MaxSkip=5000)]
在浏览器中检查后$skip=4999
有效,$skip=5000
有效,$skip=5001
出错,我尝试再次下载Excel中的数据。
不幸的是,Excel停止在5000处发生服务器错误,并且没有显示数据。
我怎样才能让它发挥作用?
答案 0 :(得分:1)
是的,当从OData服务获取数据时,Excel将忽略分页。 由于您设置了MaxSkip = 5000,因此当excel尝试获取第5001条记录时它将失败。那么你的预期行为是什么?如果您想控制返回金额,可以在查询中组合$ skip和$ top,并在服务中设置MaxSkip和MaxTop以控制最大值。