Вложенные отношения данных

В реляционном представлении данных отдельные таблицы содержат строки, связанные друг с другом, с помощью столбца или набора столбцов. В ADO.NET DataSetсвязь между таблицами реализуется с помощью DataRelation. При создании DataRelation отношения между родительскими и дочерними столбцами управляются только через отношение. Таблицы и столбцы являются отдельными сущностями. В иерархическом представлении данных, предоставляемых XML, отношения родительского-дочернего элемента представлены родительскими элементами, содержащими вложенные дочерние элементы.

Чтобы упростить вложение дочерних объектов, когда DataSet синхронизирован с XmlDataDocument или данные записываются как XML с использованием WriteXml, DataRelation предоставляет свойство Nested. Nested Установка свойства DataRelation в true приводит к тому, что дочерние строки связи оказываются вложенными в родительском столбце при записи в виде XML-данных или синхронизации с XmlDataDocument. Свойство NestedDataRelation имеет значение false, по умолчанию.

Например, рассмотрим следующий набор данных.

' 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"]);

Nested Так как свойство DataRelation объекта не задано true для этого набора данных, дочерние объекты не вложены в родительские элементы, когда они DataSet представлены как XML-данные. Преобразование XML-представления DataSetнабора данных, содержащего связанные наборы данных с не вложенными связями, может вызвать замедление производительности. Рекомендуется вложить отношения данных. Для этого установите свойство Nested в true. Затем напишите код в таблице стилей XSLT, которая использует иерархические выражения запросов XPath сверху вниз для поиска и преобразования данных.

В следующем примере кода показан результат вызова WriteXmlнабора данных.

<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>

Обратите внимание, что Customers элемент и Orders элементы отображаются как одноуровневые элементы. Если вы хотите, чтобы элементы Orders появились как дочерние элементы их соответствующих родительских элементов, следует задать свойство Nested для DataRelation на true и добавить следующее:

customerOrders.Nested = True
customerOrders.Nested = true;

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

<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>

См. также