我的列表中有7000个项目。我需要过滤列表并检索结果 我在我的网站部分使用以下代码。
string query = "<Where><BeginsWith><FieldRef Name='Project' /><Value Type='Text'>ab</Value></BeginsWith></Where>"
SPQuery spquery = new SPQuery();
spquery.Query = query;
ContentIterator iterator = new ContentIterator();
iterator.ProcessListItems(list, spquery, ProcessListItem, ProcessListItemError)
因为我正在使用ContentIterator,它仍然给我错误“禁止尝试的操作,因为它超出了管理员强制执行的列表视图阈值”
更新
string query2 = @"<Where><Eq><FieldRef Name='Project' /><Value Type='Text'>11759</Value></Eq></Where>";
SPQuery spquery = new SPQuery();
spquery.RowLimit = 10;
spquery.Query = query2;
spquery.QueryThrottleMode = SPQueryThrottleOption.Override;
ContentIterator iterator = new ContentIterator();
iterator.ProcessListItems(list, spquery, ProcessListItem, ProcessListItemError);
在每种情况下天气都使用SPCollectionItem
或Iterator。我何时通过spquery
中的where条件。同样的错误来了。
答案 0 :(得分:2)
要有效地使用ContentIterator并避免限制异常,您应该明确包含OrderBy子句。
尝试使用实际启用索引的ContentIterator.ItemEnumerationOrderByNVPField。
有关详情,请查看
http://extreme-sharepoint.com/2012/07/17/data-access-via-caml-queries/
答案 1 :(得分:1)
可能因为您要比较的字段未编入索引:http://msdn.microsoft.com/en-us/library/ff798465
如果要构建一个返回前100个排序项的查询 通过ID字段,查询将在没有问题的情况下执行,因为ID 列总是被索引。但是,如果您要构建一个查询 返回按非索引标题字段排序的前100个项目 查询必须扫描内容数据库中的所有10,000行 为了在返回第一个之前按标题确定排序顺序 100件物品。因此,查询将受到限制,并且正确 所以这是一项资源密集型的运作。
答案 2 :(得分:0)
你要么......
RowLimit
。答案 3 :(得分:0)
嗯,刚尝试了这个,它仍然出错了。如果我使用它,但我可以迭代超过7k列表项:
private int GetItems(SPList list){
var query = new SPQuery();
query.Query = "";
query.QueryThrottleMode = SPQueryThrottleOption.Override;
var items = list.GetItems(query);
return items.Count;
}
所以我的建议就是使用list.getitems
答案 4 :(得分:0)
您只需要更改查询。
//Keep your query inside <View></View> tag.
string query = "<View><Where><BeginsWith><FieldRef Name='Project' /><Value Type='Text'>ab</Value></BeginsWith></Where><View>"
SPQuery spquery = new SPQuery();
spquery.Query = query;
ContentIterator iterator = new ContentIterator();
iterator.ProcessListItems(list, spquery, ProcessListItem, ProcessListItemError)
现在运行该程序,它将起作用。