C# 将OData参数($filter,$orderby,…)应用于列表

C# 将OData参数($filter,$orderby,…)应用于列表,c#,odata,iqueryable,C#,Odata,Iqueryable,问题: 我有一个集合列表,我需要通过OData参数$filter,$orderby等筛选此集合。是否有我可以使用的东西来实现我的目标 来源: SharePoint REST API的阈值限制为5000个项目,当列表中有更多项目时,将引发异常。这就是为什么这不起作用的原因: HOST/_vti_bin/listdata.svc/MyList?$filter=FieldName eq 'foo'&$orderby=OtherFIeld asc 我们可以获取所有项目,但不能像这样使用ODat

问题:

我有一个集合列表,我需要通过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
HOST/_vti_bin/listdata.svc/MyList?$skiptoken=4988
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;
}
作为响应,我们将获得uu next属性,在那里我们可以找到我们将用于获取下一页数据的url,它将如下所示:

HOST/_vti_bin/listdata.svc/MyList
HOST/_vti_bin/listdata.svc/MyList?$skiptoken=4988
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;
}
这就是我们获取所有项目的方式。现在我需要应用初始请求中的OData参数来过滤我这边的结果。我不知道怎么做。

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

HOST/_vti_bin/listdata.svc/MyList
HOST/_vti_bin/listdata.svc/MyList?$skiptoken=4988
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;
}

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