确定SPQuery返回的项的总计数

时间:2010-10-27 10:06:05

标签: sharepoint sharepoint-2010 caml

我正在针对SharePoint 2010中的大型列表运行多个CAML查询,并将结果以网格视图的形式显示给最终用户。我希望翻阅查询返回的结果以提高性能。但是,我需要在分页控件上显示查询返回的项目总数。我的问题是,如何确定每个查询将返回的项目总数,而不是在单个SPListItemCollection中实际返回它们?确切地说,我希望一次翻阅结果10个项目;我怎么能这样做,仍然有查询返回的所有项目的总数?

更新

到目前为止,所给出的答案都没有解决我的问题 - 因此,我正在提供赏金。我需要能够获得CAML查询将返回的项目总数,而无需运行查询并返回所有项目。这将使我能够向最终用户显示此总计数值(设置要求),同时在项目集合中进行分页以在网格视图中显示特定的结果页面。这将避免包含gridview首次加载的页面上的大型列表的大量性能损失。

如果没有人提供上述内容的有效答案,我将接受一个答案,该答案提供指向MSDN文章的链接,该文章明确指出无法实现上述功能。

谢谢,MagicAndi。

8 个答案:

答案 0 :(得分:7)

答案 1 :(得分:2)

这是SharePoint的限制。这就是为什么SharePoint不显示您在视图中有多少页面。

答案 2 :(得分:2)

您可以为该列表创建一个视图,每页的项数限制为10.然后使用listview控件(而不是gridview)并绑定视图。

答案 3 :(得分:2)

对不起它接缝CAML查询没有通过......所以再次

    <Aggregations Value="On">
        <FieldRef Name="LinkTitle" Type="COUNT"/>
    </Aggregations>

答案 4 :(得分:1)

花了几个小时试图弄清楚如何做到这一点....下面列出了为了获得完整列表而需要做的事情。

1)修改您正在访问的列表视图,并在总计中将COUNT添加到其中一列

2)将以下代码添加到webpart中的CAML查询中                               

3)添加以下代码以显示计数

            <xsl:value-of select="/dsQueryResponse/Rows/Row/@*[name()='YOUR_COLUMN_NAME_FROM_FIRST_STEP.COUNT']"/>

并且享受......我已经使用过滤器检查过它。

技术

答案 5 :(得分:0)

不知道我们是否在同一页面上...但您可以非常简单地计算SPQuery收到的项目:

   SPQuery query = new SPQuery();
   query.Query = string.Concat(
                  "<Where><Eq>",
                     "<FieldRef Name='Status'/>",
                     "<Value Type='CHOICE'>Not Started</Value>",
                  "</Eq></Where>",
                  "<OrderBy>",
                     "<FieldRef Name='DueDate' Ascending='TRUE' />",
                     "<FieldRef Name=’Priority’ Ascending='TRUE' />", 
                  "</OrderBy>");                    


   SPListItemCollection items = list.GetItems(query);
   double totalCount = items.Count;

也许这是你的解决方案。

答案 6 :(得分:0)

可能有两种解决方案,都有局限性:

  • 执行没有定义视域的轻量级查询
  • 使用'无限寻呼机'(例如,如果您使用DataGrid,将VirtualItemCount设置为10K或更高)

答案 7 :(得分:0)

我只找到了一个&#34;脏&#34;完全不受任何支持的方式:) 我已经在数据库上创建了一个视图,并且滥用了SQL服务器来为我计算。 完全破碎,完全没有支持,绝对会咬自己,但我发现的唯一方法是计算大量的记录。 没有使用它,因为它不适合生产。

编辑:所有列表数据都被转储到一个巨大的表AllUserData中,如果你有tp_listid,你可以创建一个计数

SELECT        COUNT(nvarchar7) AS Expr1
FROM          dbo.AllUserData
WHERE        (tp_ListId = 'xxxxxxxx-9999-3333-7777-yyyyyyyyyyyy')

但是如果你使用它们,你必须开始过滤版本

WHERE        (tp_Version =
             (SELECT        MAX(tp_Version) AS ex1
             FROM            {{view above}} AS V1
             WHERE        (key = M.key)))

等等你可以得到计数,你可以很快得到它,但脚会见枪......