3

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

更新

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

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

谢谢,魔术师安迪。

4

8 回答 8

8

不幸的是,我认为你不会从 MSDN 得到明确的答案,说什么不可能的……只有什么. 这是 msdn 上的整个CAML 查询架构页面。那里没有提到任何类型的“计数”功能。

至于解决您的问题,首先您需要选择正确的查找项目的方法。例如,这里有几个案例:

  1. 一个列表中的项目?反洗钱
  2. 来自同一站点中的几个列表的项目?SPSiteDataQuery
  3. 许多站点中的许多列表中的项目?搜索 API

其次,您可以在 Web 部件中实现某种缓存,以减少排序/分页/过滤所需的时间。我喜欢使用System.Web.HttpRuntime.Cache来存储 a DataTable(可以轻松更改检索项目的方法,而您的网格可以继续使用数据表)。您也可以使用Page.Session而不是缓存。

于 2010-11-03T20:14:49.190 回答
2

这是 SharePoint 的限制。这就是为什么 SharePoint 不显示您查看了多少页面的原因。

于 2010-10-27T14:06:44.913 回答
2

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

于 2010-10-29T07:00:11.473 回答
2

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

    <Aggregations Value="On">
        <FieldRef Name="LinkTitle" Type="COUNT"/>
    </Aggregations>
于 2010-11-28T22:43:58.067 回答
1

刚刚花了几个小时试图弄清楚如何做到这一点.... 下面列出了您需要执行的操作才能获得完整列表计数。

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

2) 将以下代码添加到 Web 部件中的 CAML 查询中

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

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

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

艺术

于 2010-11-28T22:35:48.877 回答
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;

也许这是你的解决方案。

于 2011-12-05T12:30:15.740 回答
0

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

  • 执行没有定义视场的轻量级查询
  • 使用“无限寻呼机”(例如,如果您使用 DataGrid,请将 VirtualItemCount 设置为 10K 或以上)
于 2013-08-02T11:34:52.643 回答
0

我只发现了一种完全不受任何支持的“肮脏”方式:) 我在数据库上创建了一个视图,并滥用 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)))

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

于 2016-11-16T08:31:08.880 回答