【问题标题】:Apply OData parameters ($filter, $orderby,...) to List<T>将 OData 参数 ($filter, $orderby,...) 应用于 List<T>
【发布时间】:2014-12-03 01:35:43
【问题描述】:

问题:

我有一个集合列表我需要通过 OData 参数($filter、$orderby 等)过滤这个集合 有什么我可以使用的东西可以满足我的需求吗?

产地:

SharePoint REST API 有一个阈值限制(5000 个项目),当列表有更多项目时会引发异常。这就是为什么这不起作用:

HOST/_vti_bin/listdata.svc/MyList?$filter=FieldName eq 'foo'&$orderby=OtherFIeld asc

我们可以获取所有项目,但不能像这样使用 OData 参数:

HOST/_vti_bin/listdata.svc/MyList

作为响应,我们将获得 __next 属性,我们可以在其中找到用于获取下一页数据的 url,它看起来像这样:

HOST/_vti_bin/listdata.svc/MyList?$skiptoken=4988

这就是我们获取所有物品的方式。现在我需要从初始请求中应用 OData 参数来过滤我这边的结果。我不知道该怎么做。

【问题讨论】:

  • 我不太明白你的最后一句话。是否过滤结果包含超过 5000 项出现异常,您想找到一种方法来获取所有过滤后的项目?
  • @YiDing 不是,是的。当 SP 列表包含超过 5000 个项目时,任何 OData 过滤都会失败(您可以使用索引)。这就是我获取所有项目、将它们存储在 List 中并将原始 OData 参数应用于该列表的原因。结果我只得到了我需要的那些东西。
  • 如何使用 "HOST/_vti_bin/listdata.svc/MyList?$filter=FieldName eq 'foo'&$orderby=OtherFIeld asc & $top=5000"?
  • $top 在这里没有帮助......阈值限制不仅适用于返回结果的数量,还适用于列表中的项目数。这就是为什么你不能 $orderby 或 $filter 超过 5000 个项目。

标签: c# odata iqueryable


【解决方案1】:

从这个answer,你可以做这样的事情:

public async Task<Object> GetMyList(ODataQueryOptions<MyObject> options = null)
{
    // Get your list from SharePoint
    List<MyObject> myObjects = GetMyObjectListFromSharePoint();

    // This will apply the OData query parameters 
    // to your IQueryable object but won't execute the query
    IQueryable query = options.ApplyTo(myObjects.AsQuerable());

    // This will execute the above query 
    // and return the new list of MyObject
    List<Object> result = await query.ToListAsync();

    // Do post result actions

    return result;
}

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2015-05-24
    • 2012-04-25
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多