我想获得与查询匹配的项目总数,但也限制了结果。

  • 所以说我在列表中有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

许可以下: CC-BY-SA归因
scroll top