在SharePoint的企業應用中,遇到復雜的邏輯的時候,我們會需要多表查詢;SharePoint和Sql數據表一樣,也支持多表聯合查詢,但是不像Sql語句那樣簡單,需要使用SPQuery的Joins屬性來完成。
下面,我們通過一個簡單的例子,為大家演示一下如何使用SPQuery通過查閱項字段來進行兩個列表的聯合查詢。
1、首先創建測試列表,City是城市,然后有一個列表叫做Address,是地址,通過查閱項Location進行關聯,CityID字段是Number類型,這里代表城市的ID號;
創建列表完畢以后,輸入一些簡單的測試數據,如下圖:
2、測試列表Address,添加一個查閱項字段,特別要說的是,截圖勾選了Title,后來因為查閱項關聯的就是Title,我就去掉了,希望不要對后來造成誤會,如下圖:
3、查看創建完畢列表的所有欄,如下圖:
4、看着Location:CityID這樣的名稱不是很舒服,索性點進去,改名,如下圖:
5、如下圖,便是我們創建完畢的測試列表,包含簡單的測試數據:
6、創建一個控制台程序,引用Microsoft.SharePoint.dll,編寫測試代碼,因為控制台程序的創建過程非常簡單,這里只貼了核心代碼,如下:
1 using (SPSite site = new SPSite(SiteUrl)) 2 { 3 using (SPWeb web = site.RootWeb) 4 { 5 SPQuery query = new SPQuery(); 6 //Joins屬性,這里有INNER和LEFT兩種方式連接,均可查詢,而且支持多表連接; 7 query.Joins = "<Join Type='INNER' ListAlias='City'>" + 8 "<Eq>" + 9 "<FieldRef Name='Location' RefType='Id'/>" + 10 "<FieldRef List='City' Name='ID'/>" + 11 "</Eq>" + 12 "</Join>"; 13 //設置關聯的查閱項字段 14 query.ProjectedFields = "<Field Name='CustomCityID' Type='Lookup' " + 15 "List='City' ShowField='CityID'/>"; 16 //設置需要顯示的字段 17 query.ViewFields = "<FieldRef Name='Title'/>" + 18 "<FieldRef Name='Location'/>" + 19 "<FieldRef Name='CustomCityID'/>"; 20 21 SPList list = web.GetList(ListName); 22 SPListItemCollection itemcoll = list.GetItems(query); 23 foreach (SPListItem item in itemcoll) 24 { 25 SPFieldLookupValue Location = new SPFieldLookupValue(item["Location"].ToString()); 26 SPFieldLookupValue CustomCityID = new SPFieldLookupValue(item["CustomCityID"].ToString()); 27 Console.WriteLine("ID:" + item.ID.ToString() + " Title:" + item["Title"].ToString() + " Location:" + Location.LookupValue + " CustomCityID:" + CustomCityID.LookupValue); 28 } 29 } 30 }
7、執行控制台程序,下面是查詢的結果,如下圖:
到這里,大家可能會有疑問,這樣的查詢,和列表的查詢是一樣的,怎么叫做多列表聯合查詢呢?下面請繼續,聽我慢慢道來;
8、我們在列表City里多添加一列,名稱暫且叫做Mark,但是不將其作為查閱項關聯到Address列表,如下圖:
Address列表所有欄屬性,並不包含Mark,如下圖:
9、同時為代碼的ProjectedFields多添加Mark的字段屬性,如下圖:
query.ProjectedFields = "<Field Name='CustomCityID' Type='Lookup' List='City' ShowField='CityID'/> <Field Name='CustomMark' Type='Lookup' List='City' ShowField='Mark'/>";
10、同時為顯示屬性加入CustomMark字段,如下圖:
query.ViewFields = "<FieldRef Name='Title'/>" + "<FieldRef Name='Location'/>" + "<FieldRef Name='CustomCityID'/>" + "<FieldRef Name='CustomMark'/>";
輸出添加CustomMark字段的值,如下:
SPFieldLookupValue CustomMark = new SPFieldLookupValue(item["CustomMark"].ToString()); Console.WriteLine("CustomMark:" + CustomMark.LookupValue)
11、再次執行控制台程序,並沒有以查閱項關聯到Address的Mark字段,也被查詢出來了,也就是我們說的多表聯合查詢,如下圖:
總 結
以上內容,就是本文的全部內容,SharePoint多表查詢,通過查閱項字段進行關聯,然后使用SPQuery的Joins屬性進行關聯查詢,通過設置關聯的字段和需要顯示的字段來設置顯示,完成關聯查詢。
本例是使用列表City和Address進行關聯查詢,查詢Address列表通過查閱項關聯查詢City列表;列表結構附后,好了,就到這里吧,希望本文能夠帶給需要的人以幫助,謝謝!
附:列表結構
列表一:City
字段:Title(默認字段,單行文本,作為Address關聯的查閱項)
CityID(數字類型,作為Address關聯的查閱項)
Mark(單行文本,作為多表查詢的測試字段)
列表二:Address
字段:Title(默認)
Location(查閱項,關聯City列表的Title)
CustomCityID(查閱項,關聯City列表的CityID)
附:參考鏈接
http://social.msdn.microsoft.com/Forums/sharepoint/zh-CN/866a49fd-0656-4a8a-9e11-36eeb4401005/sharepoint-2010-caml-list-joins
http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.spquery.joins.aspx