列出联接和投影

系统 1504 0

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 字段的外键字段。

<Joins> <Join Type='LEFT' ListAlias='customer'> <Eq> <FieldRef Name='CustomerName' RefType='Id'/> <FieldRef List='customer' Name='ID'/> </Eq> </Join> <Join Type='LEFT' ListAlias='customer_city'> <Eq> <FieldRef List='customer' Name='CityName' RefType='Id'/> <FieldRef List='customer_city' Name='Id'/> </Eq> </Join> <Join Type='LEFT' ListAlias='customer_city_state'> <Eq> <FieldRef List='customer_city' Name='StateName' RefType='Id'/> <FieldRef List='customer_city_state' Name='Id'/> </Eq> </Join> <Join Type='LEFT' ListAlias='shipper'> <Eq> <FieldRef Name='ShipperName' RefType='Id'/> <FieldRef List='shipper' Name='ID'/> </Eq> </Join> <Join Type='LEFT' ListAlias='shipper_city'> <Eq> <FieldRef List='shipper' Name='CityName' RefType='Id'/> <FieldRef List='shipper_city' Name='Id'/> </Eq> </Join></Joins>
视图中的投影字段

ProjectedFields 字段从外列表创建字段,这样它们就可以在列表视图中使用。字段还必须在 View 元素的 ViewFields 子元素中标识。

继续演示父母俱乐部的示例,下面的 ProjectedFields 将为客户所在城市、客户所在州和发货人所在城市创建字段。注意下面的内容与此标记有关:

外列表是通过其别名标识的,如 Joins 元素中所定义的那样。

ShowField 属性标识外列表中的哪个字段在视图中使用。

Type 属性始终具有值“Lookup”。出于此原因, Type 属性不会像它通常在 Field 元素中所表现的那样指示字段的数据类型。当 Field 元素为 ProjectedFields 的子级时, Type 仅仅指示 Join (在 ProjectedFields 元素所依赖的 Joins 元素中)是否基于列表之间的现有查阅关系。所有联接必须基于现有查阅关系。可作为投影字段的 CAML 字段类型的列表如下所示。

<ProjectedFields> <Field Name='CustomerCity' Type='Lookup' List='customer_city' ShowField='Title'/> <Field Name='CustomerCityState' Type='Lookup' List='customer_city_state' ShowField='Title'/> <Field Name='ShipperCity' Type='Lookup' List='shipper_city' ShowField='Title'/></ProjectedFields>

只有以下类型的字段可包括在 ProjectedFields 元素中:

Calculated(视为纯文本)

ContentTypeId

Counter

Currency

DateTime

Guid

Integer

Note(只有一行)

Number

Text

如上所述,在 ProjectedFields 元素中创建的字段也有必要在 ViewFields 元素中指定。以下标记继续说明该示例。

<ViewFields> <FieldRef Name='CustomerCity'/> <FieldRef Name='CustomerCityState'/> <FieldRef Name='ShipperCity'/></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 属性的值如下。

<Joins> <Join Type=’LEFT’ ListAlias=’customers’> <Eq> <FieldRef Name=’CustomerName’ RefType=’Id’ /> <FieldRef List=’customers’ Name=’ID’ /> </Eq> </Join> <Join Type=’LEFT’ ListAlias=’customerCities’> <Eq> <FieldRef List=’customers’ Name=’CityName’ RefType=’Id’ /> <FieldRef List=’customerCities’ Name=’ID’ /> </Eq> </Join></Joins>

因为查询的 Where 部分将测试客户所在城市,我们需要创建一个 CustomerCity 字段。因此, ProjectedFields 的值如下。

<ProjectedFields> <Field Name=’CustomerCity’ Type=’Lookup’ List=’customerCities’ ShowField=’Title’ /></ProjectedFields>

接下来,我们需要通过将对该字段的引用添加到 ViewFields 元素,使该字段可用。因此, ViewFields 属性的值如下。

<ViewFields> <FieldRef Name='CustomerCity'/></ViewFields>

最后, Query 属性设置如下。

<Query> <Where> <Eq> <FieldRef Name='CustomerCity'/> <Value Type='Text'>London</Value> </Eq> </Where></Query>

我们建议您在 CAML 查询涉及列表联接时使用显式 Joins 元素,从而最大限度地提高标记的可读性。这种做法也能尽最大可能提高您的查询标记与未来版本的 SharePoint Foundation 兼容的机会。但是,有一种方式支持两个列表的隐式联接,而不需要使用 Joins 元素。您只要如上所述创建一个 ProjectedFields 元素即可,除了以下例外情况:子级 Field 元素具有 FieldRef 属性,而不是 List 属性。 FieldRef 只标识源列表中的 Lookup 列。而且,在 ProjectedFields 元素具有 FieldRef 属性而不是 List 属性时,其 Name 属性应该被赋予不同于源列表中任何列的某个任意值。(再次说明,在此标记中,不需要标识目标列表,因为它在 查阅关系的配置中指定。

例如,假设列表和查阅关系与前一节中的相同,您将具有以下查询和 ViewFields 元素。

<Query> <Where> <Eq> <FieldRef Name='CustomerName'/> <Value Type='Text'>Hicks, Cassie</Value> </Eq> </Where></Query><ViewFields> <FieldRef Name='CustomerName'/></ViewFields>

注意, Where 元素在“Orders”和“Customers” 列表之间进行隐式联接。您可以只通过以下 ProjectedFields 元素支持此查询。您不需要使用 Joins 元素。(注意,已经为 Name 属性指定不同于通过 FieldRef 属性指定的实际查阅列名称的任意名称。)

<ProjectedFields> <Field Name=’OrderingCustomer’ Type=’Lookup’ FieldRef=’CustomerName’ ShowField=’Title’ /></ProjectedFields>

即使使用此技巧,仍然要求源列与目标列表之间存在查阅关系。另外,通过此技巧,您不能链接联接。例如,您无法支持前一节末尾处显示的 Query 元素。该查询创建了从 Orders 到 Customers 到 Cities 的隐式双联接。联接链需要显式 Joins 元素。

阅读全文
类别: moss技术   查看评论

列出联接和投影


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论