依然莫名其妙的内容查询Web部件(Content Query Web Part)

内容查询Web部件(Content Query Web Part,或简称CQWP)自从在2007引入SharePoint(企业版)以来,受到了无数人的关注。一方面因为其跨网站、跨列表查询的能力、样式订制扩展的能力,另一方面也因为各种各样的Bug。

其中最“臭名昭著”的一个Bug,就是在查询的列表超过10个的时候,可能无法返回完整的结果,这个是由于其核心的SPSiteDataQuery的Bug造成的(微软已经确定声明这个Bug,详见:http://support.microsoft.com/kb/946484

最近的一个项目是用到了2010,在类似需求的场景中,使用了另外一个API - CrossListQuery,这个同样是CQWP的核心查询,是对SPSiteDataQuery的一个封装,利用了对象缓存的功能,可以在服务器端缓存查询结果,以此来提高查询性能,这三者的关系基本上可以用下图来表示:

image

因为担心上面提到的那个Bug,我还专门用SPSiteDataQuery测试了一下,当超过10个文档库并且有不同字段设置的时候,可以查询到完整结果。

于是很Happy的就用了,然后上线了,然后客户开始迁移数据,当迁移到10万+文档的时候,客户过来找我,说首页的“最新更新”内容都不见了……

于是在解决这个问题的过程中,我陆陆续续发现了如下莫名其妙的现象:

1、同样的查询条件,RowLimit限制为5,返回0个结果;RowLimit为24,返回2个结果;RowLimit为30,返回5个结果;RowLimit为50,返回50个结果……

2、同样的查询条件,使用修改时间排序的时候,不返回任何结果;使用我自己定义的一个字段排序的时候,正常;使用ID排序的时候,正常……

3、同样的查询条件和排序条件,使用系统账户的时候,一切正常;使用另一个完全控制权限(通过Web应用程序策略设置)的账号,不返回任何结果……

通过上述现象的观察,基本上确定了不是我们自己的代码造成的问题,为了进一步验证这一点,我直接使用了CQWP,现象同上。

上述经验表明,CQWP是个大坑(网上搜CQWP + Bug,可以找到各种各样诡异的现象),尤其在大数据量的时候,慎用。

 

btw,最后我们的解决办法,就是无论页面上需要显示多少个结果(首页是5个),都强制后台查询的RowLimit为50,然后在前台扔掉后45个……

btw2,SharePoint 2013中引入了CQWP的一个替代品,Content Search Web Part,这个是基于搜索的,也很有意思,有机会专门分享一下这个东西。

你可能感兴趣的:(content)