现在的位置: 首页 > 综合 > 正文

在sharepoint中 使用SPSiteDataQuery来进行跨列表查询

2016年10月27日 ⁄ 综合 ⁄ 共 4196字 ⁄ 字号 评论关闭

2012-05-29 edit by jasondct

SPSiteDataQuery对象呢? 功能比较强大, sharepoint 里面还有个SPQuery对象,一个是基于列表(list)里面来查询,一个可以跨列表来查询!

比如,比如说! 我们现在要查询 站点下 任务列表里面 任务状态为“未完成”的! 这样我就可以知道哪些小子工作不是很卖力了哦.. (呵呵),

如果用SPQuery对象呢? 就必须知道任务List,那么站点下面还有子站点呢? 子站点的任务List呢? 还要每个去找找! 像这样,我们就可以直接使用SPSiteDataQuery对象,可以查询出站点下所有状态为“未完成”的任务id,记住,他是可以跨列表的哦!

由于我每次使用SPSiteDataQuery呢?每次都要去学习SPSiteDataQuery对象,每次都要去google (or baidu) . 现在闲麻烦了,特此记录下来了!下面列出了参考的资料链接,当然关于SPSiteDataQuery的用户,参数说明,也是在链接里面收集下来的!

private void SiteDataQueryTest()
        {
            using (SPWeb web = new SPSite("http://dg-mlwang/").OpenWeb())
            {
                SPSiteDataQuery query = new SPSiteDataQuery();
                query.Lists = "<Lists ServerTemplate=\"107\" />";
                //query.Lists = "<Lists BaseType=\"0\" />";
                //query.Lists = "<Lists Hidden = \"true\" />";
                //默认只是当前web哦, 不包括子站点
                query.Webs = "<Webs Scope='SiteCollection' />";
                query.Query =
                  "<Where><Eq><FieldRef Name=\"Status\"/>" +
                  "<Value Type=\"Text\">未完成</Value></Eq></Where>";

                //query.ViewFields = "<FieldRef Name=\"Title\" />";
                DataTable items = web.GetSiteData(query);
                if (items.Rows.Count > 0)
                {
                    for (int i = 0; i < items.Rows.Count; i++)
                    {
                        string listID = items.Rows[i][0] + "";
                        SPList list = web.Lists[new Guid(listID)];
                        Response.Write("Title:" + list.Title + "<br />");
                    }
                }
                GridView1.DataSource = items;
                GridView1.DataBind();

                //修改上传新文档显示 New 标示符 的天数
                //web.Site.WebApplication.DaysToShowNewIndicator = 1;

            }
        }

query.webs:

此元素的属性只有一个:Scope。能赋予它的值有3个吧,尽管MSDN上说只有2个…..

"<Webs Scope='SiteCollection' />",包含当前网站所在的网站集(Site)下所有网站(Web)以及子网站(Web)

"<Webs Scope='Recursive' />",包含当前网站(Web)以及其下的所有子网站(Web)

缺省,仅仅包含当前网站(Web)

query.lists:

此元素将定义你在文档库(Document Libraries)或者列表(Lists)里的搜索范围。
属性有4个:BaseType、ServerTemplate、Hidden、MaxListLimit
此外,子元素有两个:List、WithIndex。使用子元素可以将搜索条件限制在比较小的范围之内。
下面是关于属性的介绍。

BaseType (例:"<Lists BaseType='1'/>")

必须要注意的是这个属性的默认值为"<Lists BaseType='0'/>",也就是说缺省或者该属性设置出错时会查询文档库以外的所有列表。

ServerTemplate (例: "<Lists ServerTemplate='850'/>")
搜索指定类型的列表(850为页面库列表类型)。这个属性的值出错时会以默认值进行查询。

Hidden (例:"<Lists ServerTemplate='850' Hidden='TRUE'/>")
设定能否搜索隐藏列表。默认是搜索所有非隐藏的列表。

MaxListLimit (例:"<Lists BaseType='1' MaxListsLimit='500'/>")
定义搜索的列表的总数,当超过这个数字时,SPSiteDataQuery会抛出一个SPException的例外。这个属性的默认值为1000。当把此属性设置为0时,那么搜索的列表数目将不会受到限制。

query.ViewFields:

此元素定义返回哪些Fields(列表的列)也就是说定义了作为搜索结果的DataTable将包含哪些列(Column)。比如:
<ViewFields>

<FieldRef Name="Title" Nullable="TRUE" />

</ViewFields>

Name (例:<FieldRef Name="Title" />)

Nullable (例:<FieldRef Name="Title" Nullable="TRUE" />)。

Nullable属性为可选项。我们知道在MOSS里并不是所有的列表都包含了相同的列。比如SPSiteDataQuery在查询一个列表时,发现ViewFields里指定的某个列在列表里并不存在,那么这个列表将被忽略。而当指定了" Nullable "为"TRUE"时则可以避免这种情况,不管有没有这个列,该类表都会被查询,只是在返回的DataTable里该列将呈现空白。

query.Query:

而当指定了这里就是使用CAML语句了,可以用U2U工具直接生成CAML语句,复制过来即可!前面设置那么多,这里才是关键,因为这里设置检索数据的依据,上面代码中检索 任务状态为“未完成”的列表和列表项

query.RowLimit

设置返回结果数,query.RowLimit = 10; 设置只返回10行数据

BaseType 可填下列值

定义检索范围,上例为搜索所有的文档库,其他可以设定的值还有

Value

检索范围

说明

0

Generic list

除文档(Document library)以外的所有列表(Lists)

1

Document library

仅仅查询文档

3

Discussion forum

讨论版

4

Vote or Survey

投票和调查

5

Issues list

问题列表

ServerTemplate 可填下列值

如何确定ServerTemplate的值。

1. 在 WSS3.0 的 SDK 的 Lists 属性主题里,你可以找到可用列表的一系列类型。

2. 查找feature文件下相应List的模板文件,查看Type属性的值。
例如通过下面的文件,就可以查看Announcements list的ServerTemplate为104:
(C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\AnnouncementsList\ListTemplates\Announcements.xml)

3 参考:

http://egrimmett.wordpress.com/2008/04/01/servertemplate-numbers/

   
100 Generic list
101 Document library
102 Survey
103 Links list
104 Announcements list
105 Contacts list
106 Events list
107 Tasks list
108 Discussion board
109 Picture library
110 Data sources
111 Site template gallery
112 User Information list
113 Web Part gallery
114 List template gallery
115 XML Form library
116 Master pages gallery
117 No-Code Workflows
118 Custom Workflow Process
119 Wiki Page library
120 Custom grid for a list
130 Data Connection library
140 Workflow History
150 Gantt Tasks list
200 Meeting Series list
201 Meeting Agenda list
202 Meeting Attendees list
204 Meeting Decisions list
207 Meeting Objectives list
210 Meeting text box
211 Meeting Things To Bring list
212 Meeting Workspace Pages list
300 Portal Sites list
301 Blog Posts list
302 Blog Comments list
303 Blog Categories list
850 Page Library
1100 Issue tracking
1200 Administrator tasks list
2002 Personal document library
2003 Private document library

英文资料:http://blog.thekid.me.uk/archive/2007/02/27/spsitedataquery-samples-for-wss-v3.aspx

中文参考:http://www.cnblogs.com/Kenr/archive/2009/06/02/1494260.html

关于更多 SPSiteDataQuery 介绍请查阅MSDN :http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.spsitedataquery.aspx

抱歉!评论已关闭.