Навигация по отношениям DataRelationNavigating DataRelations

Одно из основных назначений объекта DataRelation состоит в обеспечении переходов от одного объекта DataTable к другому в пределах DataSet.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. Это позволяет DataRow извлекать все связанные объекты в одной таблице DataTable при наличии одного объекта DataRow из связанного объекта DataTable.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Например, после установления отношения DataRelation между таблицей Customers и таблицей заказов можно получить все строки заказа для конкретной строки клиента с помощью GetChildRows.For example, after establishing a DataRelation between a table of customers and a table of orders, you can retrieve all the order rows for a particular customer row using GetChildRows.

В следующем примере кода создается отношение DataRelation между таблицей Customers и таблицей Orders набора данных и возвращаются все заказы для каждого клиента.The following code example creates a DataRelation between the Customers table and the Orders table of a DataSet and returns all the orders for each customer.

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(custRow["CustomerID"].ToString());

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine(orderRow["OrderID"].ToString());
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim custRow, orderRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine(orderRow("OrderID").ToString())
    Next
Next

Следующий пример основан на предыдущем примере; в нем четыре таблицы связываются друг с другом и происходит переход по этим связям.The next example builds on the preceding example, relating four tables together and navigating those relationships. Как и в предыдущем примере, CustomerID связывает таблицу Customers с таблицей Orders .As in the previous example, CustomerID relates the Customers table to the Orders table. Для каждого клиента в таблице Customers все дочерние строки в таблице Orders определяются, чтобы получить количество заказов конкретного клиента и их значения OrderID .For each customer in the Customers table, all the child rows in the Orders table are determined, in order to return the number of orders a particular customer has and their OrderID values.

Развернутый пример также возвращает значения из таблиц OrderDetails и Products .The expanded example also returns the values from the OrderDetails and Products tables. Таблица Orders связана с таблицей OrderDetails с помощью OrderID , чтобы определить, какие товары и количества были заказаны для каждого заказа клиента.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Так как таблица OrderDetails содержит только ProductID заказанного товара, OrderDetails связан с продуктами , использующими ProductID для возврата значения ProductName.Because the OrderDetails table only contains the ProductID of an ordered product, OrderDetails is related to Products using ProductID in order to return the ProductName. В этом отношении таблица Products является родительской, а таблица Order Details является дочерней.In this relation, the Products table is the parent and the Order Details table is the child. В результате при итерации по таблице OrderDetails вызывается жетпарентров для получения связанного значения ProductName .As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Обратите внимание, что при создании DataRelation для таблиц Customers и Orders значение не указывается для флага креатеконстраинтс (значение по умолчанию — true).Notice that when the DataRelation is created for the Customers and Orders tables, no value is specified for the createConstraints flag (the default is true). Предполагается, что все строки в таблице Orders имеют значение CustomerID , которое существует в родительской таблице Customers .This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Если идентификатор клиента существует в таблице Orders , которая не существует в таблице Customers , то ForeignKeyConstraint вызывается исключение.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Если дочерний столбец может содержать значения, которые не содержит родительский столбец, установите для флага креатеконстраинтс значение false при добавлении DataRelation.When the child column might contain values that the parent column does not contain, set the createConstraints flag to false when adding the DataRelation. В этом примере флаг креатеконстраинтс имеет значение false для DataRelation между таблицей Orders и OrderDetails .In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. Это позволяет приложению возвращать все записи из таблицы OrderDetails и только подмножество записей из таблицы Orders без создания исключения времени выполнения.This enables the application to return all the records from the OrderDetails table and only a subset of records from the Orders table without generating a run-time exception. В этом расширенном образце вывод формируется в следующем формате.The expanded sample generates output in the following format.

Customer ID: NORTS  
  Order ID: 10517  
        Order Date: 4/24/1997 12:00:00 AM  
           Product: Filo Mix  
          Quantity: 6  
           Product: Raclette Courdavault  
          Quantity: 4  
           Product: Outback Lager  
          Quantity: 6  
  Order ID: 11057  
        Order Date: 4/29/1998 12:00:00 AM  
           Product: Outback Lager  
          Quantity: 3  

Следующий пример кода является расширенным примером, в котором возвращаются значения из таблиц OrderDetails и Products , при этом возвращается только подмножество записей в таблице Orders .The following code example is an expanded sample where the values from the OrderDetails and Products tables are returned, with only a subset of the records in the Orders table being returned.

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

DataRelation orderDetailRelation =
    customerOrders.Relations.Add("OrderDetail",
    customerOrders.Tables["Orders"].Columns["OrderID"],
    customerOrders.Tables["OrderDetails"].Columns["OrderID"], false);

DataRelation orderProductRelation =
    customerOrders.Relations.Add("OrderProducts",
    customerOrders.Tables["Products"].Columns["ProductID"],
    customerOrders.Tables["OrderDetails"].Columns["ProductID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine("Customer ID: " + custRow["CustomerID"]);

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine("  Order ID: " + orderRow["OrderID"]);
        Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]);

        foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation))
        {
            Console.WriteLine("\t Product: " +
                detailRow.GetParentRow(orderProductRelation)["ProductName"]);
            Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);
        }
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim orderDetailRelation As DataRelation = _
   customerOrders.Relations.Add("OrderDetail", _
   customerOrders.Tables("Orders").Columns("OrderID"), _
   customerOrders.Tables("OrderDetails").Columns("OrderID"), False)

Dim orderProductRelation As DataRelation = _
   customerOrders.Relations.Add("OrderProducts", _
   customerOrders.Tables("Products").Columns("ProductID"), _
   customerOrders.Tables("OrderDetails").Columns("ProductID"))

Dim custRow, orderRow, detailRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine("  Order ID: " & orderRow("OrderID").ToString())
        Console.WriteLine(vbTab & "Order Date: " & _
          orderRow("OrderDate").ToString())

        For Each detailRow In orderRow.GetChildRows(orderDetailRelation)
            Console.WriteLine(vbTab & "   Product: " & _
              detailRow.GetParentRow(orderProductRelation) _
              ("ProductName").ToString())
            Console.WriteLine(vbTab & "  Quantity: " & _
              detailRow("Quantity").ToString())
        Next
    Next
Next

См. такжеSee also