Вложенность объектов DataRelation (ADO.NET)

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

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

Например, рассмотрим следующий набор 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"]);

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

В следующем примере кода показан результат вызова WriteXml для 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>

Обратите внимание, что элемент 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>

См. также

Основные понятия

Добавление объектов DataRelation (ADO.NET)

Другие ресурсы

Использование XML в DataSet (ADO.NET)

Объекты DataSet, DataTable и DataView (ADO.NET)