查阅和列表关系

上次修改时间: 2010年12月1日

适用范围: SharePoint Foundation 2010

本文内容
列表关系和数据完整性
创建列表关系
创建多列查阅
发现列表关系
发现相关项目

在 Microsoft SharePoint Foundation 中,查阅字段是配置为从其他列表中的字段获取其值的字段。将查阅字段添加到列表会在该列表和提供数据的列表之间建立一种关系。

如何引用这两个列表取决于您所依据的角度。从查阅字段的角度来讲,提供数据的列表是目标列表,作为数据来源的字段是目标字段。从目标列表的角度来讲,包含查阅字段的列表是相关列表。查阅字段本身是相关字段。

提示提示

SPList 类具有 GetRelatedFields 方法,可用来发现指向列表的查阅字段。

为简单起见,并为了防止混淆,有时称这两个列表具有父子关系。子列表具有查阅字段。父列表具有数据源,即作为查阅字段目标的字段。

列表关系和数据完整性

在 Microsoft SharePoint Foundation 2010 中,您可以在子列表中配置一个查阅字段,以便它在父列表中的项上设置删除约束。当您通过用户界面创建或编辑查阅列时,可以选择"强制关系行为"。如果选择此选项,则随后可以选择"限制删除"或"级联删除"。限制删除 可防止在子列表中的一个或多个相关项引用父列表中的项时删除该项。如果使用级联删除,则从父列表中删除某个项会导致子列表中的所有相关项也被删除。

若要在代码中启用相同行为,请将 SPFieldLookup 对象的RelationshipDeleteBehavior 属性设置为 SPRelationshipDeleteBehavior 枚举中的值,即 Restrict 或 Cascade。

重要注释重要信息

若要对 SharePoint Foundation 使用限制删除或级联删除,必须对查阅字段编制索引。将该字段的 Indexed 属性设置为 true。

删除约束的目的是强制实施引用完整性。在不希望包含查阅字段的项目因指向目标列表中不存在的项目而成为孤立项时,可应用约束。

例如,假定您有两个列表:"客户"和"地址"。您决定通过将名为"客户 ID"的查阅字段添加到"地址"列表,并将该查阅字段指向"客户"列表中的 ID 字段,来将这两个列表相关联。配置了此查阅后,通过指定"客户"列表中的删除必须与"地址"列表级联,可以对这两个列表之间的关系设置约束。选择级联删除可通过确保"地址"列表不会通过收集孤立的地址来强制实施引用完整性。从"客户"列表删除项目时,相关项目将从"地址"列表中自动删除。

假定您还有一个"待定订单"列表,和"地址"列表一样,通过指向"客户"列表中 ID 字段的查阅字段关联到"客户"列表。对于在"待定订单"列表中有待定订单的客户,您可能不希望其客户记录从"客户"列表中删除。在这种情况下,可以通过在"待定订单"列表上配置查阅字段来限制其"客户"父列表中的删除,以实现引用完整性。

选择级联或限制删除的副作用是查询字段的值在设置时即生效。当有人通过用户界面新建项目时,如果目标列表中的项目少于 20 个,表单上的查阅列通过下拉列表表示;这种情况下,该用户被限制为只能选择有效值。如果目标列表中的项目超过 20 个,将使用不同的控制方式,用户必须键入值;在这种情况下,键入无效值会导致表单上出现红色验证文本。使用对象模型设置查阅字段的值时,会进行类似的验证。在这种情况下,如果指定的值未指向目标列表中的现有项目,SharePoint Foundation 将引发异常。

您可以选择不再查阅列表上设置任何删除限制。例如,除了"地址"和"待定订单"列表,您还可能有一个"完成订单"列表,和其他相关列表一样,指向"客户"列表中的 ID 字段。对于任何完成订单,即使您不再保留下订单的客户的记录,也可以保留订单记录。引用完整性不是问题,因此就不必对查阅列表中的删除指定任何约束。在这种情况下,从"客户"列表中删除项目不会影响"完成订单"列表。

创建列表关系

查阅字段由 SPFieldLookup 类的实例表示。该类包括构造函数,但创建查阅字段的最简单方法是调用 SPFieldCollection 类的 AddLookup 方法。AddLookup 方法具有重载,允许您从创建查询的网站上创建对不同网站中列表的查阅。

备注

您可以在不同网站中的列表之间创建关系,但无法对该关系设置限制行为。SharePoint Foundation 不会强制实施跨 Web 查阅的引用完整性。

将查阅列添加到列表

  1. 通过访问列表的 Fields 属性来获取对其的字段集合的引用。

  2. 调用 SPFieldCollection 对象的 AddLookup 方法,从而传递第二个参数中的查阅列表(数据源)的 ID

    AddLookup 方法返回一个带有新字段的内部名称的字符串。

  3. 通过调用 GetFieldByInternalName 方法来获取对表示新字段的 SPFieldLookup 对象的引用,从而作为参数传递 AddLookup 方法返回的字符串。

    GetFieldByInternalName 方法返回 SPField 对象,必须将后者转换为类型 SPFieldLookup

  4. LookupField 属性设置为查阅列表中字段的内部名称,SPFieldLookup 对象应将该列表用作其数据源。

    LookupField 属性的目标必须为下列字段类型之一:

    此外,如果输出内容是文本,目标可以为 SPFieldCalculated 类型。有关详细信息,请参阅 OutputType 属性。如果为字段启用了查阅,目标可以为 SPFieldComputed 类型。有关详细信息,请参阅 EnableLookup 属性。

  5. (可选)如果打算指定 None(默认值)之外的删除行为,请将 Indexed 属性设置为 true。

  6. (可选)使用 SPRelationshipDeleteBehavior 枚举值设置 RelationshipDeleteBehavior 属性。

    重要注释重要信息

    用户必须对查阅列表具有 ManageLists 权限才能指定 Cascade 或 Restrict。有关详细信息,请参阅 SPBasePermissions 枚举。

    此外,在以下情况下,设置关系行为将失败:

    • 查阅字段允许多个值。

      在设置 RelationshipDeleteBehavior 属性之前,请确保 AllowMultipleValues 属性返回 false。

    • 现有列表项包含查阅字段的无效值。

      如果以前将查阅字段的 RelationshipDeleteBehavior 属性设置为 None,并且某人删除了查阅字段指向的目标列表上的项,则会发生这种情况。查阅字段因此变为孤立的;它包含无效值。如果列表包含孤立的查阅字段,则无法强制执行关系行为。

    • 查阅字段指向其他网站中的列表。

      检查查阅字段的 LookupWebId 属性的值。

    • 列表中的项数超过为目标列表设置的最大值。

      将列表的 ItemCount 属性返回的值与 Web 应用程序的 MaxItemsPerThrottledOperation 属性返回的值进行比较。

  7. 调用 Update 方法以提交对对象进行的更改。

示例

以下示例是在"客户"列表和"待定订单"列表之间创建关系的控制台应用程序。该应用程序调用 AddLookup 方法以将名为"客户 ID"的查阅字段添加到"待定订单"列表,并将该字段指向"客户"列表上的 ID 字段。新的"客户 ID"字段将被编制索引并设置为限制从查阅列表中执行删除。

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList lookupList = site.Lists.TryGetList("Customers");
                    SPList relatedList = site.Lists.TryGetList("Pending Orders");

                    if (lookupList != null && relatedList != null)
                    {
                        string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
                        SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);

                        primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
                        primaryCol.Indexed = true;
                        primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
                        primaryCol.Update();
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim lookupList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")

                If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then
                    Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
                    Dim primaryCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)

                    primaryCol.LookupField = lookupList.Fields("ID").InternalName
                    primaryCol.Indexed = True
                    primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
                    primaryCol.Update()
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

创建多列查阅

在 SharePoint Foundation 2010 中,您可以对同一查阅列表创建多列查阅。例如,假定您有两个列表:"客户"和"待定订单"。通过将"客户 ID"列添加到"待定订单"列表并将该列指向"客户"列表中的 ID 字段,可以在两个列表之间建立关系。当查看"待定订单"列表中的项目时,除了查看订单本身的描述信息外,您还希望查看有关下订单的客户的重要信息。为了解决此问题,您决定在 查阅列"客户 ID"之外再添加三个 查阅列,以显示客户的名字、姓氏和电话号码。

多列查阅中的次列依赖于主列,以此保持其在查阅列表中的关系。您无法对次查阅列建立删除约束。为主列设置的约束是应用到该查阅列表的唯一约束。

创建次查阅列的程序与创建主查阅列的过程几乎完全相同。主要差别是您通过调用 SPFieldCollection 类的AddDependentLookup 方法而不是 AddLookup 方法创建字段。AddDependentLookup 方法具有两个参数:用于次字段的显示名称;以及主字段的 ID。

示例

以下示例是在"客户"列表和"待定订单"列表之间创建关系的控制台应用程序。该应用程序调用 AddLookup 方法将名为"客户 ID"的主查阅字段添加到"待定订单"列表,并将该字段指向"客户"列表上的 ID 字段。新的"客户 ID"字段将被编制索引并设置为限制从查阅列表中执行删除。

创建主查阅字段后,该应用程序会创建三个名为"名字"、"姓氏"和"电话"的次查阅字段。应用程序通过调用表示"待定订单"列表的字段集合的对象的 AddDependentLookup 方法创建这些字段。

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList lookupList = site.Lists.TryGetList("Customers");
                    SPList relatedList = site.Lists.TryGetList("Pending Orders");

                    if (lookupList != null && relatedList != null)
                    {

                        // Create the primary column.
                        string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
                        SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);

                        primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
                        primaryCol.Indexed = true;
                        primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
                        primaryCol.Update();


                        // Create the secondary columns.

                        string strFirstNameCol = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id);
                        SPFieldLookup firstNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strFirstNameCol);
                        firstNameCol.LookupField = lookupList.Fields["First Name"].InternalName;
                        firstNameCol.Update();

                        string strLastNameCol = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id);
                        SPFieldLookup lastNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strLastNameCol);
                        lastNameCol.LookupField = lookupList.Fields["Last Name"].InternalName;
                        lastNameCol.Update();

                        string strPhoneCol = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id);
                        SPFieldLookup phoneCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPhoneCol);
                        phoneCol.LookupField = lookupList.Fields["Phone"].InternalName;
                        phoneCol.Update();
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim lookupList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")

                If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then

                    ' Create the primary column.
                    Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
                    Dim primaryCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)

                    primaryCol.LookupField = lookupList.Fields("ID").InternalName
                    primaryCol.Indexed = True
                    primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
                    primaryCol.Update()


                    ' Create the secondary columns.

                    Dim strFirstNameCol As String = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id)
                    Dim firstNameCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strFirstNameCol), SPFieldLookup)
                    firstNameCol.LookupField = lookupList.Fields("First Name").InternalName
                    firstNameCol.Update()

                    Dim strLastNameCol As String = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id)
                    Dim lastNameCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strLastNameCol), SPFieldLookup)
                    lastNameCol.LookupField = lookupList.Fields("Last Name").InternalName
                    lastNameCol.Update()

                    Dim strPhoneCol As String = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id)
                    Dim phoneCol As SPFieldLookup = _
                        DirectCast(relatedList.Fields.GetFieldByInternalName(strPhoneCol), SPFieldLookup)
                    phoneCol.LookupField = lookupList.Fields("Phone").InternalName
                    phoneCol.Update()
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

发现列表关系

您可以通过在表示查阅列表的 SPList 对象上调用 GetRelatedFields 方法来发现相关列表中的哪些字段依赖于查阅列表中的信息。该方法返回具有以下属性的 SPRelatedField 对象的集合:

GetRelatedFields 方法具有重载,允许您只获取有关指定特定删除约束的那些字段的信息。

仅返回表示多列查阅中主列的相关字段的信息。若要获取有关次列的信息,请调用表示主列的 SPFieldLookup 对象的 GetDependentLookupInternalNames 方法。

示例

以下示例是一个控制台应用程序,该应用程序报告向其他列表中的查阅字段提供数据的"客户"列表中字段的信息。对于表示主列的每个相关字段,该应用程序调用 GetDependentLookupInternalNames 方法来获取表示次列的字段列表。

using System;
using System.Collections.Generic;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList targetList = site.Lists.TryGetList("Customers");
                    SPRelatedFieldCollection relatedFields = targetList.GetRelatedFields();

                    string strSeparator = new String('=', 70);
                    string strUnderline = new String('-', 20);
                    string strFormat = "Target Field: {0} | Related Field: {1}";

                    Console.WriteLine(strSeparator);
                    foreach (SPRelatedField fieldInfo in relatedFields)
                    {
                        using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                        {
                            SPList relatedList = relatedSite.Lists.GetList(fieldInfo.ListId, false);
                            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
                            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

                            Console.WriteLine("\nTarget List: {0} ({1}) | Related List: {2} ({3})", targetList.Title, site.Title, relatedList.Title, relatedSite.Title);

                            Console.WriteLine("\nPrimary Column");
                            Console.WriteLine(strUnderline);
                            Console.WriteLine(strFormat, targetField.Title, relatedField.Title);
                            Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior);

                            Console.WriteLine("\nSecondary Columns");
                            Console.WriteLine(strUnderline);

                            List<string> dependents = relatedField.GetDependentLookupInternalNames();
                            for (int i = 0; i < dependents.Count; i++)
                            {
                                SPFieldLookup lookup = relatedList.Fields.GetFieldByInternalName(dependents[i]) as SPFieldLookup;
                                SPField field = targetList.Fields.GetFieldByInternalName(lookup.LookupField);

                                Console.WriteLine(strFormat, field.Title, lookup.Title);
                            }
                            Console.WriteLine();
                            Console.WriteLine(strSeparator);
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim targetList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedFields As SPRelatedFieldCollection = targetList.GetRelatedFields()

                Dim strSeparator As String = New [String]("="c, 70)
                Dim strUnderline As String = New [String]("-"c, 20)
                Dim strFormat As String = "Target Field: {0} | Related Field: {1}"

                Console.WriteLine(strSeparator)
                For Each fieldInfo As SPRelatedField In relatedFields
                    Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                        Dim relatedList As SPList = relatedSite.Lists.GetList(fieldInfo.ListId, False)
                        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
                        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

                        Console.WriteLine(vbLf & "Target List: {0} ({1}) | Related List: {2} ({3})", _
                                          targetList.Title, site.Title, relatedList.Title, relatedSite.Title)

                        Console.WriteLine(vbLf & "Primary Column")
                        Console.WriteLine(strUnderline)
                        Console.WriteLine(strFormat, targetField.Title, relatedField.Title)
                        Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior)

                        Console.WriteLine(vbLf & "Secondary Columns")
                        Console.WriteLine(strUnderline)

                        Dim dependents As List(Of String) = relatedField.GetDependentLookupInternalNames()
                        Dim i As Integer = 0
                        While i < dependents.Count
                            Dim lookup As SPFieldLookup = _
                                TryCast(relatedList.Fields.GetFieldByInternalName(dependents(i)), SPFieldLookup)
                            Dim field As SPField = targetList.Fields.GetFieldByInternalName(lookup.LookupField)

                            Console.WriteLine(strFormat, field.Title, lookup.Title)
                            i = i + 1
                        End While
                        Console.WriteLine()
                        Console.WriteLine(strSeparator)
                    End Using
                Next
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

该控制台应用程序打印类似于以下示例的输出。

======================================================================

Target List: Customers (Team Site) | Related List: Complete Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: None

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Customer

======================================================================

Target List: Customers (Team Site) | Related List: Addresses (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Cascade

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Last Name
Target Field: First Name | Related Field: First Name

======================================================================

Target List: Customers (Team Site) | Related List: Pending Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Restrict

Secondary Columns
--------------------
Target Field: First Name | Related Field: First Name
Target Field: Last Name | Related Field: Last Name
Target Field: Phone | Related Field: Phone

======================================================================

Press ENTER to continue...

发现相关项目

SharePoint Foundation 2010 用户界面的功能区上有一个"插入相关列表"按钮,允许用户通过添加相关列表 Web 部件来编辑显示列表的页面。相关列表 Web 部件显示其他列表中与当前列表中选中项目相关的项目。例如,您可以将相关列表 Web 部件添加到"客户"列表,从而使用户可以选择客户记录,并查看相关"待定订单"列表上属于选中客户的项目。

通过使用由调用表示查阅列表的 SPList 对象的 GetRelatedFields 方法所返回的 SPRelatedField 对象的属性,您可以通过对象模型获得有关相关项目的相同信息。

示例

以下示例是一个控制台应用程序,该应用程序从"客户"列表获取项目,并查找网站集的其他列表中的相关项目。主要工作由应用程序的 PrintRelatedItems 方法完成,该方法使用查阅列表中的项目和来自 SPRelatedField 对象的信息构建针对相关列表的查询。

using System;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    int customerID = 1;

                    SPList list = site.Lists.TryGetList("Customers");
                    if (list != null)
                    {

                        // Get a customer record.
                        SPListItem customerRecord = null;
                        try
                        {
                            customerRecord = list.GetItemById(customerID);
                        }
                        catch (ArgumentException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }

                        // Print related items.
                        if (customerRecord != null)
                        {
                            Console.WriteLine("Customer: {0} {1}", 
                            customerRecord[SPBuiltInFieldId.FirstName], customerRecord[SPBuiltInFieldId.Title]);

                            // Get related list items.
                            SPRelatedFieldCollection relatedFields = list.GetRelatedFields();
                            foreach (SPRelatedField fieldInfo in relatedFields)
                            {
                                using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                                {
                                    PrintRelatedItems(customerRecord, relatedSite, fieldInfo);
                                }
                            }
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }

        static void PrintRelatedItems(SPListItem match, SPwebsite, SPRelatedField fieldInfo)
        {
            SPList targetList = fieldInfo.LookupList;
            SPList relatedList = site.Lists[fieldInfo.ListId];

            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

            object value = match[targetField.Id];

            SPQuery q = new SPQuery();
            q.Query = string.Format(@"<Where>
                                            <Eq>
                                                <FieldRef Name=""{0}""/>
                                                <Value Type=""{1}"">{2}</Value>
                                            </Eq>
                                        </Where>", relatedField.InternalName, value.GetType(), value);

            SPListItemCollection items = relatedList.GetItems(q);

            if (items.Count > 0)
            {
                Console.WriteLine("\n{0} has {1} related items:", relatedList.Title, items.Count);
                foreach (SPListItem item in items)
                    Console.WriteLine(item.DisplayName);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim customerID As Integer = 1

                Dim list As SPList = site.Lists.TryGetList("Customers")
                If list IsNot Nothing Then

                    ' Get a customer record.
                    Dim customerRecord As SPListItem = Nothing
                    Try
                        customerRecord = list.GetItemById(customerID)
                    Catch ex As ArgumentException
                        Console.WriteLine(ex.Message)
                    End Try

                    ' Print related items.
                    If customerRecord IsNot Nothing Then
                        Console.WriteLine("Customer: {0} {1}", _
                        customerRecord(SPBuiltInFieldId.FirstName), customerRecord(SPBuiltInFieldId.Title))

                        ' Get related list items.
                        Dim relatedFields As SPRelatedFieldCollection = list.GetRelatedFields()
                        For Each fieldInfo As SPRelatedField In relatedFields
                            Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                                PrintRelatedItems(customerRecord, relatedSite, fieldInfo)
                            End Using
                        Next
                    End If
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub

    Sub PrintRelatedItems(ByVal match As SPListItem, ByVal site As SPWeb, ByVal fieldInfo As SPRelatedField)
        Dim targetList As SPList = fieldInfo.LookupList
        Dim relatedList As SPList = site.Lists(fieldInfo.ListId)

        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

        Dim value As Object = match(targetField.Id)

        Dim q As New SPQuery()
        q.Query = String.Format( _
        "<Where><Eq><FieldRef Name=""{0}""/><Value Type=""{1}"">{2}</Value></Eq></Where>", _
        relatedField.InternalName, value.GetType(), value)

        Dim items As SPListItemCollection = relatedList.GetItems(q)

        If items.Count > 0 Then
            Console.WriteLine(vbLf & "{0} has {1} related items:", relatedList.Title, items.Count)
            For Each item As SPListItem In items
                Console.WriteLine(item.DisplayName)
            Next
        End If
    End Sub

End Module

请参阅

任务

如何:创建多列查阅

引用

SPFieldLookup

SPRelatedField

其他资源

如何:以编程方式设置查阅字段中的删除行为(该链接可能指向英文页面)