从查询获取spquery totalitems
-
10-12-2019 - |
题
我想获得与查询匹配的项目总数,但也限制了结果。
- 所以说我在列表中有100项。 列表中100项中的
- 50匹配我的查询。
- 我只想得到50中的10个。
- 如何获得“50”?
一个简单的查询:
.SPQuery query = new SPQuery() { Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>" }; SPList oList = web.Lists["Profile"]; SPListItemCollection items = oList.GetItems(query); int count = items.Count;
解决方案
这是一个众所周知的,很难解决问题,尤其是在大量数据方面。即使没有触摸SharePoint,您也可能注意到许多系统(Google是一个明显的示例)返回近似的过滤元素数。
基本上您可以做的唯一方法是执行相同的查询,但排除除ID之外的权限和所有字段。所以在SQL方面,它将是这样的:
SELECT id FROM list WHERE (filter)
.
如果列表中有超过5 000个项目(或超过“限制限制”设置值的其他值),您将不得不放置所有参与的字段索引到索引(请参阅“列表设置”页面上的“索引列”链接),和您必须使用lookup字段放弃过滤 (这些是以下类型的字段:查找,托管元数据,人员和组,工作流状态)。
也建议在一些大数字中限制此查询,例如100万项或类似的东西,所以它将是:
.
SELECT TOP 100000 id FROM list WHERE (filter)
所以,它将如何应用于spquery?
.
var query = new SPQuery()
{
// please make sure FirstName and FullName fields are added to index!!
Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>",
ViewFields = "ID",
ViewFieldsOnly = true,
IncludePermissions = false,
RowLimit = 100000
};
请记住,如果您有大量物品,或者如果您的沉重(在SQL)过滤器中,它将执行缓慢。
其他提示
实时查询命中性能相当硬,真的没有好方法在没有迭代的情况下计算列表中的项目。
还要记住itemcount和list.items.count在某些情况下将返回不同的数字。
对于大型列表,这一决定背后有推理: http://technet.microsoft.com/en-us/library/cc262813.aspx