Навигация по DataRelations

Одной из основных функций DataRelation является возможность навигации от одного DataTable к другому в пределах DataSet. Это позволяет получить все связанные DataRow объекты в одном DataTable случае при указании одного DataRow из связанного объекта DataTable. Например, после установления связи между таблицей клиентов и таблицей заказов, можно получить все строки заказов для определенной строки клиента с помощью DataRelation.

В следующем примере кода создается DataRelation, который устанавливает связь между таблицей Customers и таблицей Orders в DataSet, и возвращаются все заказы для каждого клиента.

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

Следующий пример основан на предыдущем примере, связанном с четырьмя таблицами и навигацией по этим связям. Как и в предыдущем примере, CustomerID связывает Customers таблицу с Orders таблицей. Для каждого клиента в Customers таблице определяются все дочерние строки в Orders таблице, чтобы вернуть количество заказов, которые имеет конкретный клиент, и их OrderID значения.

Развернутый пример также возвращает значения из OrderDetails таблиц и Products таблиц. Таблица Orders связана с таблицей, используемой OrderDetailsOrderID для определения каждого заказа клиента, того, какие продукты и количества были заказаны. OrderDetails Так как таблица содержит ProductID только заказанного продукта, OrderDetails связывается с Products при помощи ProductID, чтобы вернуть ProductName. В этом отношении таблица Products является родительской, а таблица "Сведения о заказе" является дочерней. В результате, при итерации по таблице, вызывается OrderDetails, чтобы получить связанное значение GetParentRow.

Обратите внимание, что при создании DataRelation для таблиц Customers и Orders, для флага createConstraints не указано значение (по умолчанию - true). Предполагается, что все строки в Orders таблице имеют CustomerID значение, которое существует в родительской Customers таблице. Если CustomerID существует в таблице Orders, но отсутствует в таблице Customers, то ForeignKeyConstraint вызывает исключение.

Если дочерний столбец может содержать значения, которые родительский столбец не содержит, задайте createConstraints флаг false при добавлении DataRelation. В примере createConstraints флаг задается false для DataRelation между Orders таблицей и OrderDetails таблицей. Это позволяет приложению возвращать все записи из таблицы и только подмножество записей из OrderDetailsOrders таблицы без создания исключения среды выполнения. Развернутый пример создает выходные данные в следующем формате.

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.

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

См. также