C# 将OData参数($filter,$orderby,…)应用于列表
问题: 我有一个集合列表,我需要通过OData参数$filter,$orderby等筛选此集合。是否有我可以使用的东西来实现我的目标 来源: SharePoint REST API的阈值限制为5000个项目,当列表中有更多项目时,将引发异常。这就是为什么这不起作用的原因: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
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个项目的原因。