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

时间:2014-06-25 07:31:14

标签: c# asp.net excel asp.net-web-api odata

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

情景:

  • 大型数据库视图,大约有4千万行(MySQL)
  • 数据库优先EDMX(实体框架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;
    } 
}

如果我尝试使用这些网址在浏览器中获取数据

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处发生服务器错误,并且没有显示数据。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

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