Aninhamento de DataRelations

Em uma representação relacional de dados, as tabelas individuais contêm linhas relacionadas umas às outras usando uma coluna ou um conjunto de colunas. No ADO.NET DataSet, a relação entre tabelas é implementada usando um DataRelation. Quando você cria um DataRelation, as relações pai-filho das colunas são gerenciadas somente por meio da relação. As tabelas e colunas são entidades separadas. Na representação hierárquica dos dados fornecidos pelo XML, as relações pai-filho são representadas por elementos pai que contêm elementos filho aninhados.

Para facilitar o aninhamento de objetos filho quando um DataSet é sincronizado com um XmlDataDocument ou gravado como dados XML usando WriteXml, o DataRelation expõe uma propriedade Nested. Definir a propriedade Nested de um DataRelation como true faz com que as linhas filho da relação sejam aninhadas dentro da coluna pai quando gravadas como dados XML ou sincronizadas com um XmlDataDocument. Por padrão, a propriedade Nested da DataRelation é false.

Por exemplo, considere o seguinte DataSet.

' Assumes connection is a valid SqlConnection.  
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT CustomerID, CompanyName FROM Customers", connection)  
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection)  
  
connection.Open()  
  
Dim dataSet As DataSet = New DataSet("CustomerOrders")  
customerAdapter.Fill(dataSet, "Customers")  
orderAdapter.Fill(dataSet, "Orders")  
  
connection.Close()  
  
Dim customerOrders As DataRelation = dataSet.Relations.Add( _  
  "CustOrders", dataSet.Tables("Customers").Columns("CustomerID"), _  
  dataSet.Tables("Orders").Columns("CustomerID"))  
// Assumes connection is a valid SqlConnection.  
SqlDataAdapter customerAdapter = new SqlDataAdapter(  
  "SELECT CustomerID, CompanyName FROM Customers", connection);  
SqlDataAdapter orderAdapter = new SqlDataAdapter(  
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection);  
  
connection.Open();  
  
DataSet dataSet = new DataSet("CustomerOrders");  
customerAdapter.Fill(dataSet, "Customers");  
orderAdapter.Fill(dataSet, "Orders");  
  
connection.Close();  
  
DataRelation customerOrders = dataSet.Relations.Add(  
  "CustOrders", dataSet.Tables["Customers"].Columns["CustomerID"],  
  dataSet.Tables["Orders"].Columns["CustomerID"]);  

Como a propriedade Nested do objeto DataRelation não está definida como true para esse DataSet, os objetos filho não são aninhados dentro dos elementos pai quando esse DataSet é representado como dados XML. Transformar a representação XML de um DataSet que contém DataSets relacionados com relações de dados não aninhados pode causar um desempenho lento. É recomendável fazer o aninhamento das relações de dados. Para fazer isso, defina a propriedade Nested como true. Em seguida, grave o código na folha de estilos XSLT que usa expressões de consulta XPath hierárquicas de cima para baixo para localizar e transformar os dados.

O exemplo de código a seguir mostra o resultado da chamada WriteXml no DataSet.

<CustomerOrders>  
  <Customers>  
    <CustomerID>ALFKI</CustomerID>  
    <CompanyName>Alfreds Futterkiste</CompanyName>  
  </Customers>  
  <Customers>  
    <CustomerID>ANATR</CustomerID>  
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>  
  </Customers>  
  <Orders>  
    <OrderID>10643</OrderID>  
    <CustomerID>ALFKI</CustomerID>  
    <OrderDate>1997-08-25T00:00:00</OrderDate>  
  </Orders>  
  <Orders>  
    <OrderID>10692</OrderID>  
    <CustomerID>ALFKI</CustomerID>  
    <OrderDate>1997-10-03T00:00:00</OrderDate>  
  </Orders>  
  <Orders>  
    <OrderID>10308</OrderID>  
    <CustomerID>ANATR</CustomerID>  
    <OrderDate>1996-09-18T00:00:00</OrderDate>  
  </Orders>  
</CustomerOrders>  

Observe que o elemento Customers e os elementos Orders são mostrados como elementos irmãos. Se você quisesse que os elementos Orders aparecessem como filhos de seus respectivos elementos pai, a propriedade Nested da DataRelation precisaria ser definida como true e você adicionaria o seguinte:

customerOrders.Nested = True  
customerOrders.Nested = true;  

O código a seguir mostra como seria a saída resultante, com os elementos Orders aninhados em seus respectivos elementos pai.

<CustomerOrders>  
  <Customers>  
    <CustomerID>ALFKI</CustomerID>  
    <Orders>  
      <OrderID>10643</OrderID>  
      <CustomerID>ALFKI</CustomerID>  
      <OrderDate>1997-08-25T00:00:00</OrderDate>  
    </Orders>  
    <Orders>  
      <OrderID>10692</OrderID>  
      <CustomerID>ALFKI</CustomerID>  
      <OrderDate>1997-10-03T00:00:00</OrderDate>  
    </Orders>  
    <CompanyName>Alfreds Futterkiste</CompanyName>  
  </Customers>  
  <Customers>  
    <CustomerID>ANATR</CustomerID>  
    <Orders>  
      <OrderID>10308</OrderID>  
      <CustomerID>ANATR</CustomerID>  
      <OrderDate>1996-09-18T00:00:00</OrderDate>  
    </Orders>  
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>  
  </Customers>  
</CustomerOrders>  

Confira também