【转】4.3SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)
(四)使用SPSiteDataQuery進行多列表查詢
1、概述
前面介紹的列表查詢有很多優勢,但是它的一個缺點就是一次只能在一個列表中進行查詢,在SharePoint中,提供了一個跨網站、跨列表查詢的機制。通過使用SPSiteDataQuery對象,以及SPWeb的GetSiteData方法,將SPSiteDataQuery作為參數,可以進行跨網站和跨列表的查詢。
它與列表查詢的相同之處在于:
(1) 使用同樣的Query屬性確定篩選條件和排序條件(不支持分組條件);
(2) 使用同樣的ViewFields屬性確定返回字段;
(3) 使用同樣的RowLimit屬性確定一次返回的條目數。
它與列表查詢的不同之處在于:
(1) 可以跨網站跨列表查詢(但是有一定的限制,見后文);
(2) 返回的類型是DataTable,而非SPListItemCollection;
(3) 不支持像列表查詢那樣的分頁功能;
(4) 不再有ViewAttributes和Folder指定精細的查詢范圍;
(5) ViewFields屬性返回字段的設置略有差別。
?
2、同時在多個列表中進行數據查詢
通過使用SPSiteDataQuery的Lists屬性指定跨列表的范圍。
Lists是一個string類型的屬性,同樣需要使用CAML的格式來定義列表的范圍,定義的方法包括如下內容:
(1) 指定列表模板,查詢指定列表模板的所有列表,指定方式形如:“<Lists ServerTemplate='TemplateID' />”。其中的TemplateID為列表模板的整型ID,SharePoint內置列表模板的ID可以在SPListTemplateType枚舉中查到,例如通知列表模板的ID是104.
(2) 指定列表基類型,查詢指定基類型的所有列表,指定方式形如:“<Lists BaseType='BaseTypeID' />”。其中的BaseTypeID是列表基類型的ID,可以通過SPBaseType枚舉查到,例如文檔庫類型的ID為1。
(3) 指定是否查找隱藏列表,默認情況下,跨列表查詢時忽略隱藏列表的(比如網站模板庫、母版頁庫等等),可以通過在Lists屬性中指定Hidden屬性來查找隱藏列表,形如:“<Lists Hidden='TRUE'/>”。
(4)指定查找某些特定的列表,通過列表的Guid可以在某幾個特定的列表中進行查找,形如:
1: <Lists> 2: <List ID="7A9FDBE6-0841-430a-8D9A-53355801B5D5" /> 3: <List ID="3D18F506-FCA1-451e-B645-2D720DC84FD8" /> 4: </Lists>(5)指定查找包含某個索引字段的列表,形如:
1: <Lists> 2: <WithIndex FieldId="D4819257-6B69-41F1-82C8-A91615BFF500" 3: Type="Text" Value="Complete" /> 4: </Lists>如果默認不指定Lists屬性,則其默認值為“<Lists BaseType='0' />”,即相當于查找所有的GenericList(普通列表),并且不包括隱藏列表在內。
需要特別聲明的是,盡管提供了上述多種跨列表的方式,但是無論使用哪一種方式,跨列表查詢均無法跨越不同的BaseType進行查找。舉個例子說,SharePoint無法在跨列表查詢的時候,同時查找一個普通列表和一個文檔庫中的內容,因為它們的BaseType不同。也就是說,如果希望能夠查到一個網站中的所有列表,那么就只能進行多次查找,并將找到的DataTable結果拼合在一起。
?
3、同時在多個網站中進行數據查詢
通過使用SPSiteDataQuery的Webs屬性進行跨網站查找。
跨網站查找有三種方式:
(1) 默認不指定Webs屬性,即查找當前網站;
(2) 使用“<Webs Scope='Recursive'/>”查找當前網站及其所有后代網站;
(3)使用“<Webs Scope='SiteCollection'/>”查找整個網站集。
?
4、返回字段(欄)
在列表查詢中,如果不指定ViewFields這個屬性,那么在返回查找結果的時候,是返回列表中的所有字段;而在跨網站跨列表查詢中,如果不指定這個屬性,則在結果的DataTable中只會返回三個字段:網站ID、列表ID、列表條目ID——通過這個三個ID,就可以唯一確定一個列表條目在網站中的位置。而且這三個字段是無法去掉的。
自然,SPSiteDataQuery也可以和SPQuery一樣,通過指定ViewFields屬性,返回需要的字段值,不過有兩個地方與列表查詢有所區別:
(1) SPSiteDataQuery在指定ViewFields的時候,可以通過ListProperty標簽返回列表的屬性(基本上就是列表的標題),以及通過ProjectProperty標簽返回網站的屬性(基本上就是網站的標題)。
(2) 因為不同列表可能會存在著結構上的不同,因此在SPSiteDataQuery的ViewFields屬性的FieldRef標簽中,設置了Nullable屬性,放置某個列表字段的缺失。舉例來說,如果一個列表1中包含了字段A、B,而列表2中包含了字段A、C,用戶希望能夠在返回結果的時候返回字段A和B。如果按照原有的方式編寫ViewFields屬性,那么在列表2中的所有條目都無法被查詢到,因為列表2沒有需要顯示的B字段,為了避免這一情況的發生,可以將屬性指定為:“<FieldRef Name='A'/><FieldRef Name='B' Nullable='TRUE' />”。
下面是一個跨網站跨列表查詢的例子,例子中查詢的是網站集中所有文檔庫中名字包含“sp”的文檔和文件夾:
1: using(SPSite site = new SPSite("http://sp2010/book")) 2: { 3: using(SPWeb web = site.OpenWeb()) 4: { 5: SPSiteDataQuery query = new SPSiteDataQuery(); 6: query.Query = "<Where><Contains><FieldRef Name='FileLeafRef'/>" 7: + "<Value Type='Text'>sp</Value></Contains></Where>"; 8: query.ViewFields = "<FieldRef Name='FileLeafRef'/>" + 9: "<ListProperty Name='Title'/>" + 10: "<ProjectProperty Name='Title'/>"; 11: query.Lists = "<Lists BaseType='1' />"; 12: query.Webs = "<Webs Scope='SiteCollection' />"; 13:? 14: DataTable result = web.GetSiteData(query); 15: Console.WriteLine(result.Rows.Count); 16: } 17: }上面的程序中出于篇幅考慮沒有輸出DataTable的具體內容,可以使用Visual Studio的調試工具,在輸出一行上加入斷點,使用調試工具中的DataTable查看器來查看result變量的結果。
總結
以上是生活随笔為你收集整理的【转】4.3SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩国今年GDP或出现负增长!GDP接近韩
- 下一篇: java synchronized 关键