Partilhar via


Aninhando DataRelations

Em uma representação relacional de dados, tabelas individuais contêm linhas que estão relacionadas entre si usando uma coluna ou um conjunto de colunas. No ADO.NET DataSet, a relação entre tabelas é implementada usando um DataRelationarquivo . 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 de dados que o XML fornece, 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 escrito 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 filhas da relação sejam aninhadas na coluna pai quando escritas como dados XML ou sincronizadas com um XmlDataDocument. A propriedade Nested do DataRelation é false, por padrão.

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 este DataSet, os objetos filho não são aninhados nos 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 aninhadas pode causar um desempenho lento. Recomendamos que você aninhe as relações de dados. Para fazer isso, defina a propriedade Nested como true. Em seguida, escreva 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 de 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 respetivos elementos pai, a propriedade Nested do 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 respetivos 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>  

Consulte também