【问题标题】:ASP.NET OData v3 vs Excel 2013: ignoring pagination?ASP.NET OData v3 vs Excel 2013:忽略分页?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 如何在 Excel 中合并 $top 和 $skip?如果我从网络浏览器获取数据,我可以轻松地将此类参数添加到 URL,但 Excel 不允许我这样做。
    • 您在使用excel中的数据选项卡吗?请尝试使用可在 Web 浏览器中使用的 Url 在 Excel 中指定 OData 提要的位置
    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 2020-04-18
    • 1970-01-01
    • 2014-06-03
    • 2014-11-21
    • 2013-03-12
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多