Поделиться через


Отношения между списками и подстановки

Дата последнего изменения: 1 декабря 2010 г.

Применимо к: SharePoint Foundation 2010

В этой статье
Отношения между списками и целостность данных
Создание отношения между списками
Создание столбцов подстановки с несколькими столбцами
Обнаружение отношений между списками
Обнаружение связанных элементов

В Microsoft SharePoint Foundation поле подстановки — это поле, которое предназначено для получения значения из поля, находящегося в другом списке. При добавлении поля подстановки в список создается отношение между этим списком и списком, который предоставляет данные.

Название этих двух списков зависит от того, с какой точки зрения рассматриваются эти списки. С точки зрения поля подстановки список, который предоставляет данные, является целевым списком, а поле, из которого передаются данные, является целевым полем. С точки зрения целевого списка, список, содержащий поле подстановки, является связанным списком. Само поле подстановки является связанным полем.

СоветСовет

Класс SPList содержит метод GetRelatedFields, который можно использовать для обнаружения полей подстановки, которые указывают на список.

В целях упрощения и во избежание двусмысленности иногда говорят, что между двумя списками имеется отношение родитель-потомок. Дочерний список содержит поле подстановки. Родительский список содержит источник данных, т. е. поле, которое является целевым для поля подстановки.

Отношения между списками и целостность данных

В Microsoft SharePoint Foundation 2010 можно настроить поле подстановки в дочернем списке так, чтобы оно устанавливало ограничение на удаление элементов в родительском списке. При создании или редактировании столбца подстановки с помощью элементов пользовательского интерфейса доступен параметр Обеспечить поведение отношения. Этот параметр может принимать одно из двух значений: Ограниченное удаление или Каскадное удаление. Если выбрано значение Ограниченное удаление, элементы в родительском списке не удаляются, если на них ссылается как минимум один элемент в дочернем списке. Если выбрано значение Каскадное удаление, при удалении элемента из родительского списка также удаляются все связанные элементы из дочернего списка.

Чтобы реализовать это поведение в коде, присвойте свойству RelationshipDeleteBehavior объекта SPFieldLookup в перечислении SPRelationshipDeleteBehavior значение Restrict или Cascade.

Важное примечаниеВажно!

В SharePoint Foundation при выборе каскадного или ограниченного удаления следует помнить о том, что поле подстановки должно быть индексировано. Присвойте свойству Indexed этого поля значение true.

Цель ограничения на удаление — обеспечение целостности данных. Ограничение применяется для того, чтобы избежать ситуации, в которой элемент, содержащий поле подстановки, указывает на несуществующий элемент в целевом списке.

Например, предположим, что имеется два списка — "Клиенты" и "Адреса". Вы решили связать эти два списка, добавив поле подстановки "ИД клиента" в список "Адреса", и указываете этому полю подстановки поле "ИД" в списке "Клиенты". После настройки подстановки вы устанавливаете ограничение на отношение между двумя списками, указывая, что удаление из списка "Клиенты" должно каскадно распространяться на список "Адреса". Выбор каскадного удаления обеспечивает целостность данных, гарантируя, что список "Адреса" не содержит "потерянных" адресов. При удалении элемента из списка "Клиенты" связанные элементы автоматически удаляются из списка "Адреса".

Предположим, что также имеется список "Отложенные заказы", который, как и список "Адреса", связан со списком "Клиенты" по полю подстановки, которое указывает на поле "ИД" в списке "Клиенты". Вы решили, что не будете удалять запись о клиенте из списка "Клиенты", если клиент ожидает заказ из списка "Отложенные заказы". В этом случае необходимо принудительно обеспечить целостность данных путем указания для поля подстановки в списке "Отложенные заказы" ограничения на удаление из родительского списка "Клиенты".

Побочный эффект при выборе каскадного или ограниченного удаления заключается в том, что значения полей подстановки проверяются при установке значений. Когда пользователь создает новый элемент с помощью пользовательского интерфейса, столбец подстановки отображается в форме в виде раскрывающегося списка, если целевой список содержит менее 20 элементов. В этом случае пользователь может выбрать только допустимые значения. Если целевой список содержит более 20 элементов, используются другие элементы управления. В этом случае при вводе недопустимого значения текст в форме будет выделен красным цветом. Аналогичная проверка выполняется при использовании объектной модели для задания значения поля подстановки. В этом случае, если введенное значение указывает на несуществующий элемент в целевом списке, возникает исключение SharePoint Foundation.

Можно обойтись без ограничений на удаление в списке подстановки. Например, помимо списка "Адреса" и "Отложенные заказы" можно создать список "Выполненные заказы", который, как и остальные связанные списки, указывает на поле "ИД" в списке "Клиенты". Может потребоваться сохранить запись о выполненном заказе, даже если записи о клиентах, оформлявших заказы, больше не сохраняются. Целостность данных не является проблемой, поэтому можно не указывать ограничение на удаление из списка подстановки. В этом случае удаление элемента из списка "Клиенты" никак не повлияет на список "Выполненные заказы".

Создание отношения между списками

Поле подстановки представляется экземпляром класса SPFieldLookup. Этот класс содержит конструкторы, однако более простой способ создания поля подстановки заключается в вызове метода AddLookup класса SPFieldCollection. Метод AddLookup содержит перегрузку, которая позволяет создать подстановку в списке на веб-сайте, отличном от веб-сайта, на котором была создана подстановка.

ПримечаниеПримечание

Можно создать отношение между списками на разных веб-сайтах, однако нельзя задать для нее ограничивающее поведение. SharePoint Foundation не обеспечивает целостность данных в межсайтовых подстановках.

Добавление столбца подстановки в список

  1. Получите ссылку на семейство полей списка с помощью свойства Fields.

  2. Вызовите метод AddLookup объекта SPFieldCollection, передав свойство ID списка подстановки (источника данных) в качестве второго параметра.

    Метод AddLookup возвращает строку с внутренним именем нового поля.

  3. Получите ссылку на объект SPFieldLookup, который представляет новое поле, с помощью метода GetFieldByInternalName, передав строку, возвращенную методом AddLookup, в качестве аргумента.

    Метод GetFieldByInternalName возвращает объект SPField, который необходимо привести к типу SPFieldLookup.

  4. Укажите в качестве значения свойства LookupField внутреннее имя поля в списке подстановки, который объект SPFieldLookup должен использовать в качестве источника данных.

    Целью свойства LookupField должен быть один из следующих типов полей:

    Кроме того, цель может иметь тип SPFieldCalculated, если выходными данными является текст. Дополнительные сведения см. в описании свойства OutputType. Целевой объект может иметь тип SPFieldComputed, если для поля включены подстановки. Дополнительные сведения см. в описании свойства EnableLookup.

  5. Если требуется указать поведение удаления, отличное от значения None (по умолчанию), присвойте свойству Indexed значение true (необязательно).

  6. Присвойте свойству RelationshipDeleteBehavior значение перечисления SPRelationshipDeleteBehavior (необязательно).

    Важное примечаниеВажно!

    Для того чтобы задать значение Cascade или Restrict, пользователь должен иметь разрешение ManageLists для списка подстановки. Дополнительные сведения см. в описании перечисления SPBasePermissions.

    Кроме того, не удастся задать поведение отношения в следующих случаях:

    • Поле подстановки может содержать несколько значений.

      Прежде чем задать значение свойства RelationshipDeleteBehavior, убедитесь, что свойство AllowMultipleValues возвращает значение false.

    • Существующие элементы списка содержат недопустимые значения для поля подстановки.

      Это возможно в случае, если свойству RelationshipDeleteBehavior поля подстановки ранее было присвоено значение None и один из пользователей удалил элемент в целевом списке, на который указывает поле подстановки. Поле подстановки является потерянным и содержит недопустимое значение. Поведение отношения не может применяться принудительно, если список содержит потерянные поля подстановки.

    • Поле подстановки указывает на список, находящийся на другом веб-сайте.

      Проверьте значение свойства LookupWebId поля подстановки.

    • Число элементов в списке превышает максимальное значение для больших списков.

      Сравните значение, возвращаемое свойством ItemCount списка, со значением, возвращаемым свойством MaxItemsPerThrottledOperation веб-приложения.

  7. Вызовите метод Update, чтобы зафиксировать изменения объекта.

Пример

В следующем примере показано консольное приложение, которое создает отношение между списками Customers (Клиенты) и Pending Orders (Отложенные заказы). Приложение вызывает метод AddLookup, чтобы добавить поле подстановки Customer ID (ИД клиента) в список Pending Orders (Отложенные заказы), и указывает поле ID (ИД) в списке Customers (Клиенты). Новое поле Customer 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 можно создать подстановки с несколькими столбцами в одном и том же списке подстановки. Например, предположим, что имеется два списка: "Клиенты" и "Отложенные заказы". Можно создать отношение между списками путем добавления столбца "ИД клиента" в список "Отложенные заказы" и указать столбец в поле "ИД" в списке "Клиенты". При просмотре элементов в списке "Отложенные заказы" необходимо получить важные сведения о клиентах, оформивших заказ, в дополнение к сведениям о заказе. Для этого решено, что помимо основного столбца подстановки "ИД клиента" необходимо добавить три дополнительных столбца подстановки для имени, фамилии клиента и номера телефона.

Дополнительные столбцы в подстановке с несколькими столбцами зависят от основного столбца по отношению к списку подстановки. Для дополнительного столбца подстановки нельзя задать ограничение на удаление. К списку подстановки применяется только ограничение на удаление, заданное для основного столбца.

Процедура создания дополнительного столбца подстановки практически идентична процедуре создания основного столбца подстановки. Основное отличие заключается в том, что поле создается путем вызова метода AddDependentLookup класса SPFieldCollection вместо метода AddLookup. Метод AddDependentLookup принимает два параметра: отображаемое имя для использования в дополнительном поле и идентификатор основного поля.

Пример

В следующем примере показано консольное приложение, которое создает отношение между списками Customers (Клиенты) и Pending Orders (Отложенные заказы). Приложение вызывает метод AddLookup, чтобы добавить основное поле подстановки Customer ID (ИД клиента) в список Pending Orders (Отложенные заказы) и указывает поле ID (ИД) в списке Customers (Клиенты). Новое поле Customer ID (ИД клиента) является индексированным и для него заданы ограничения удаления из списка подстановки.

После создания основного поля подстановки приложение создает три дополнительных поля First Name (Имя), Last Name (Фамилия) и Phone (Телефон). Приложение создает эти поля путем вызова метода AddDependentLookup объекта, который представляет коллекцию полей списка Pending Orders (Отложенные заказы).

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

Обнаружение отношений между списками

Чтобы найти, какие поля в связанных списках зависят от данных в списке подстановки, вызовите метод GetRelatedFields объекта SPList, который представляет список подстановки. Метод возвращает коллекцию объектов SPRelatedField со следующими свойствами:

  • FieldId. Возвращает свойство Id поля подстановки в связанном списке.

  • ListId. Возвращает свойство ID связанного списка.

  • WebId. Возвращает свойство ID веб-сайта, на котором расположен связанный список.

  • RelationshipDeleteBehavior. Возвращает ограничение удаления, определенное для отношения.

Метод GetRelatedFields содержит перегрузку, которая позволяет получить сведения только о тех полях, которые указывают конкретное ограничение удаления.

Сведения возвращаются только для связанных полей, которые представляют основной столбец в подстановке с несколькими столбцами. Чтобы получить сведения о дополнительных столбцах, вызовите метод GetDependentLookupInternalNames объекта SPFieldLookup, который представляет основной столбец.

Пример

В следующем примере показано консольное приложение, которое передает сведения о полях в списке Customers (Клиенты), который предоставляет данные для полей подстановки в других списках. Для каждого связанного поля, представляющего основной столбец, приложение вызывает метод 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 на ленте имеется кнопка Вставить связанный список, с помощью которой пользователи могут изменять страницу, которая отображает список, путем добавления веб-части связанного списка. В веб-части связанного списка отображаются элементы других списков, которые связаны с выбранным элементом в текущем списке. Например, можно добавить веб-часть связанного списка в список "Клиенты", чтобы пользователи могли выбирать клиента и просматривать элементы в связанном списке "Отложенные заказы", которые относятся к выбранному клиенту.

Аналогичные сведения о связанных списках можно получить с помощью объектной модели и свойств объекта SPRelatedField, возвращаемого при вызове метода GetRelatedFields объекта SPList, представляющего список подстановки.

Пример

В следующем примере показано консольное приложение, которое возвращает элемент из списка Customers (Клиенты) и находит связанные элементы в других списках в семействе веб-сайтов. Основная работа выполняется с помощью метода 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

Другие ресурсы

Практическое руководство. Задание поведения удаления для поля подстановки с помощью кода (Возможно, на английском языке)