http://msdn.microsoft.com/zh-cn/library/ee539975.aspx
本主題介紹協作應用程序標記語言 (CAML) 定義的視圖和查詢中的列表聯接和字段投影。
列表視圖可包括來自其他列表、已經聯接到主列表的字段。CAML? View 元素通過其子元素 Joins 和 ProjectedFields 實現此功能,這兩個元素是在對象模型中通過 SPView 對象的 Joins 和 ProjectedFields 屬性來表示的。( SPQuery 對象具有同名的屬性。有關詳細信息,請參閱 查詢中的聯接和投影 。)
視圖中的列表聯接Joins 元素包含一個或多個 Join 元素。這些元素中的每個元素都創建一個內部聯接或兩個列表之間的左外部聯接。這些聯接中至少有一個聯接必須來自視圖的父列表,稱為主列表,另外的那個列表稱為外列表。但從該外列表到另一個外列表之間可以有額外的聯接,等等。對于聯接鏈中可以有多少鏈接沒有限制,但 Join 元素的總數,無論是否在鏈中,都不能超出包含主列表的 SPWebApplication 對象的 MaxQueryLookupFields 屬性的值。系統默認值為 8。列表可以直接或作為聯接鏈聯接到它本身。
創建列表聯接時要記住一些要求。您不能只是聯接任何兩個列表而不考慮類型。如果可以聯接兩個列表,就不僅僅是任何主字段和外字段可用作字段的聯接對。 主列表中的字段必須是 Lookup 類型的字段,它必須查找外列表中的字段。 出于此原因,所有聯接都鏡像列表之間的現有查閱關系。 |
下面的示例標記假設有一個 SharePoint Foundation 網站,網站上的父母們組成一個俱樂部,相互銷售孩子們的舊衣服。其中需要有一個 Orders 列表的視圖,該列表顯示購買成員(客戶)所在的城市和州,銷售成員(發貨人)所在的城市。若要實現此目的,需有兩個左外部聯接的鏈:
Orders 到 Members 到 Cities 到 States
Orders 到 Members 到 Cities
注意以下內容與 Joins 標記有關:
每個 Join 元素的 Type 屬性可以是“LEFT”或“INNER”。
因為從 Orders 到 Members 有兩個聯接,這兩個聯接必須區分開來。此目的是通過 ListAlias 屬性來實現的,該屬性在第一個聯接中向 Members 列表分配別名“customer”,但在第二個聯接中向該列表分配“shipper”。
從 Members 到 Cities 也有兩個聯接,它們使用同一種方式區分。
在任何地方,任何列表別名都不會明確映射到列表。映射也是不必要的,因為每個聯接與現有查閱字段關系并行,查閱字段的定義標識了外列表。
“join on”字段是通過 FieldRef 元素對標識的。第一個表示主列表中的查閱字段,并用內部名稱標識它。它必須具有設置為“ID”的 RefType 屬性。如果聯接的主列表不是視圖的父列表,則它也通過設置為其別名的 List 屬性來標識。每個元素對的第二個 FieldRef 元素再次通過別名標識外列表,也標識必須始終為 ID 字段的外鍵字段。
ProjectedFields 字段從外列表創建字段,這樣它們就可以在列表視圖中使用。字段還必須在 View 元素的 ViewFields 子元素中標識。
繼續演示父母俱樂部的示例,下面的 ProjectedFields 將為客戶所在城市、客戶所在州和發貨人所在城市創建字段。注意下面的內容與此標記有關:
外列表是通過其別名標識的,如 Joins 元素中所定義的那樣。
ShowField 屬性標識外列表中的哪個字段在視圖中使用。
Type 屬性始終具有值“Lookup”。出于此原因, Type 屬性不會像它通常在 Field 元素中所表現的那樣指示字段的數據類型。當 Field 元素為 ProjectedFields 的子級時, Type 僅僅指示 Join (在 ProjectedFields 元素所依賴的 Joins 元素中)是否基于列表之間的現有查閱關系。所有聯接必須基于現有查閱關系。可作為投影字段的 CAML 字段類型的列表如下所示。
只有以下類型的字段可包括在 ProjectedFields 元素中:
Calculated(視為純文本)
ContentTypeId
Counter
Currency
DateTime
Guid
Integer
Note(只有一行)
Number
Text
如上所述,在 ProjectedFields 元素中創建的字段也有必要在 ViewFields 元素中指定。以下標記繼續說明該示例。
聯接和投影字段還可以在 CAML 查詢中使用。在這種使用情況下,聯接和投影字段也通過 Joins 和 ProjectedFields 元素來定義。但是,這些元素不是 Query 元素的子級。它們是獨立的 XML 標記,構成表示查詢的 SPQuery 對象的 SPQuery . Joins 和 SPQuery . ProjectedFields 屬性的值。
通常最好使用 LINQ to SharePoint 提供程序 來查詢具有服務器代碼的 SharePoint Foundation 列表。因為 CAML 具有 Joins 和 ProjectedFields 元素,LINQ to SharePoint 提供程序可將 LINQ 查詢轉換為 CAML 查詢,完全支持 LINQ join (在 Visual Basic 中為 Join )和 select (在 Visual Basic 中為 Select )運算符。如果您的代碼要在客戶端運行,建議您使用 使用 ADO.NET 數據服務查詢 SharePoint Foundation 進行查詢。
如果您要直接創建 CAML 查詢,并明確設置 SPQuery 對象的相關屬性,則應該考慮使用工具來生成查詢。若要找到這樣的工具,請導航到 www.bing.com 并搜索“CAML query tool”(沒有引號)。在發布 Microsoft SharePoint Foundation 2010 之后,可能會經過一段時間才能獲得支持生成 Joins 和 ProjectedFields 元素的任何工具。
下面的示例顯示了從客戶所在城市為倫敦的 Orders 列表返回所有訂單的查詢。該示例假設 Orders 列表具有 CustomerName 字段,它查找 Customers 列表,后者具有 CityName 字段,它查找 Cities 列表。
查詢需要 Orders 到 Customers 和 Customers 到 Cities 的聯接,因此 Joins 屬性的值如下。
因為查詢的 Where 部分將測試客戶所在城市,我們需要創建一個 CustomerCity 字段。因此, ProjectedFields 的值如下。
接下來,我們需要通過將對該字段的引用添加到 ViewFields 元素,使該字段可用。因此, ViewFields 屬性的值如下。
最后, Query 屬性設置如下。
我們建議您在 CAML 查詢涉及列表聯接時使用顯式 Joins 元素,從而最大限度地提高標記的可讀性。這種做法也能盡最大可能提高您的查詢標記與未來版本的 SharePoint Foundation 兼容的機會。但是,有一種方式支持兩個列表的隱式聯接,而不需要使用 Joins 元素。您只要如上所述創建一個 ProjectedFields 元素即可,除了以下例外情況:子級 Field 元素具有 FieldRef 屬性,而不是 List 屬性。 FieldRef 只標識源列表中的 Lookup 列。而且,在 ProjectedFields 元素具有 FieldRef 屬性而不是 List 屬性時,其 Name 屬性應該被賦予不同于源列表中任何列的某個任意值。(再次說明,在此標記中,不需要標識目標列表,因為它在 查閱關系的配置中指定。
例如,假設列表和查閱關系與前一節中的相同,您將具有以下查詢和 ViewFields 元素。
注意, Where 元素在“Orders”和“Customers” 列表之間進行隱式聯接。您可以只通過以下 ProjectedFields 元素支持此查詢。您不需要使用 Joins 元素。(注意,已經為 Name 屬性指定不同于通過 FieldRef 屬性指定的實際查閱列名稱的任意名稱。)
即使使用此技巧,仍然要求源列與目標列表之間存在查閱關系。另外,通過此技巧,您不能鏈接聯接。例如,您無法支持前一節末尾處顯示的 Query 元素。該查詢創建了從 Orders 到 Customers 到 Cities 的隱式雙聯接。聯接鏈需要顯式 Joins 元素。
類別: moss技術 ? 查看評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
