13.6 Navigating Hierarchical Data

The strongly typed DataSet provides two methods for each DataRelation, TableNameRow( ) and TableNameRows( ), to facilitate navigating records in parent child relationships. These methods are similar to the GetParentRow( ) and GetChildRows( ) methods in the untyped DataSet. The TableNameRow( ) method is defined for the child table and retrieves the parent row for a DataRow. The TableNameRows( ) method is defined for the parent table in a relationship and retrieves the child rows for a DataRow.

The strongly typed DataSet methods encapsulate the DataRelations defined within the DataSet so a reference to the DataRelation or the name of the DataRelation isn't required when navigating the hierarchy of records. The following sample demonstrates using the strongly typed DataSet methods to navigate a hierarchy of records:

// strongly typed DataSet called Northwind containing Orders table and 
// OrderDetails table, related through the OrderID field
Northwind ds = new Northwind();

// ... code to fill the Orders and Order Details tables in the DataSet

foreach(Northwind.OrdersRow ordersRow in ds.Orders)
{
    // iterate the collection of order details for the order through
    // the GetOrderDetailsRow accessor
    foreach(Northwind.Order_DetailsRow orderDetailsRow in
        ordersRow.GetOrder_DetailsRows())
    {
        // get the CustomerID from the parent row, through the
        // OrdersRow property of the child row
        String customerId = orderDetailsRow.OrdersRow.CustomerID;
        
        // get the ProductID
        Int32 productId = orderDetailsRow.ProductID;
    }
}

This example shows comparable code using an untyped DataSet:

// untyped DataSet containing Orders table and 
// OrderDetails table, related through the OrderID field
DataSet ds = new DataSet();

// ... code to define or retrieve the schema for the Orders and
// [Order Details] tables schemas including creating DataRelation objects
// ... code to add new rows to the Orders and [Order Details] tables

foreach(DataRow ordersRow in ds.Tables["Orders"].Rows)
{
    foreach(DataRow orderDetailsRow in
        ordersRow.GetChildRows("Order_OrderDetails"))
    {
        // get the CustomerID from the parent row
        String customerId  = 
             orderDetailsRow.GetParentRow("Order_OrderDetails")
            ["CustomerID"].ToString();
        
        // get the ProductID
        Int32 productId = (Int32)orderDetailsRow["ProductID"];        
    }
}


    Part I: ADO.NET Tutorial
    Part II: ADO.NET Core Classes
    Part III: API Quick Reference