Zagnieżdżanie elementów DataRelation
W relacyjnej reprezentacji danych poszczególne tabele zawierają wiersze powiązane ze sobą przy użyciu kolumny lub zestawu kolumn. W ADO.NET DataSetrelacja między tabelami jest implementowana przy użyciu elementu DataRelation. Podczas tworzenia elementu DataRelation relacje nadrzędno-podrzędne kolumn są zarządzane tylko za pośrednictwem relacji. Tabele i kolumny są oddzielnymi jednostkami. W hierarchicznej reprezentacji danych zapewnianych przez xml relacje nadrzędny-podrzędny są reprezentowane przez elementy nadrzędne zawierające zagnieżdżone elementy podrzędne.
Aby ułatwić zagnieżdżanie obiektów podrzędnych, gdy zestaw danych jest synchronizowany z XmlDataDocument lub zapisywany jako dane XML przy użyciu metody WriteXml, właściwość DataRelation uwidacznia właściwość Zagnieżdżona. Ustawienie właściwości Zagnieżdżone elementu DataRelation na wartość true powoduje zagnieżdżanie wierszy podrzędnych relacji w kolumnie nadrzędnej podczas zapisywania jako danych XML lub synchronizowania z dokumentem XmlDataDocument. Właściwość Zagnieżdżona elementu DataRelation jest domyślnie fałsz.
Rozważmy na przykład następujący zestaw danych.
' 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"]);
Ponieważ właściwość Zagnieżdżone obiektu DataRelation nie jest ustawiona na wartość true dla tego zestawu danych, obiekty podrzędne nie są zagnieżdżone w elementach nadrzędnych, gdy ten zestaw danych jest reprezentowany jako dane XML. Przekształcanie reprezentacji XML elementu DataSet zawierającego powiązane zestawy Danychz relacjami danych niezagnieżdżonych może spowodować niską wydajność. Zalecamy zagnieżdżanie relacji danych. W tym celu ustaw właściwość Zagnieżdżona na true. Następnie napisz kod w arkuszu stylów XSLT, który używa hierarchicznych wyrażeń zapytań XPath najwyższego poziomu do lokalizowania i przekształcania danych.
Poniższy przykład kodu przedstawia wynik wywołania metody WriteXml w zestawie danych.
<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>
Należy pamiętać, że element Customers i elementy Orders są wyświetlane jako elementy równorzędne . Jeśli chcesz, aby elementy Orders zostały wyświetlone jako elementy podrzędne odpowiednich elementów nadrzędnych, właściwość Zagnieżdżona elementu DataRelation musi być ustawiona na wartość true i należy dodać następujące elementy:
customerOrders.Nested = True
customerOrders.Nested = true;
Poniższy kod pokazuje, jak wyglądają wynikowe dane wyjściowe z elementami Orders zagnieżdżonych w odpowiednich elementach nadrzędnych.
<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>