DataSet Üzerinde XPath Sorgusu Gerçekleştirme

Eşitlenen DataSet ile XmlDataDocument arasındaki ilişki, XmlDataDocument'a erişen VE dataset'e doğrudan erişmekten daha rahat bir şekilde belirli işlevleri gerçekleştirebilen XML Yol Dili (XPath) sorgusu gibi XML hizmetlerini kullanmanıza olanak tanır. Örneğin, bir DataSet'teki diğer tablolara ilişkilerde gezinmek için select yöntemini DataTable kullanmak yerine, biçimindeki XML öğelerinin XmlNodeListlistesini almak için DataSet ile eşitlenmiş bir XmlDataDocument üzerinde XPath sorgusu gerçekleştirebilirsiniz. XmlNodeList içindeki düğümler, düğüm olarak XmlElement yayınlanır ve eşitlenmiş DataSet içindeki tablonun satırlarına eşleşen DataRow başvurular döndürmek için XmlDataDocument'ın GetRowFromElement yöntemine geçirilebilir.

Örneğin, aşağıdaki kod örneği bir "torun" XPath sorgusu gerçekleştirir. DataSet üç tabloyla doldurulur: Müşteriler, Siparişler ve Sipariş Kuyrukları. Örnekte, önce Müşteriler ve Siparişler tabloları arasında ve Orders ve OrderDetails tabloları arasında bir üst-alt ilişki oluşturulur. Daha sonra, torun OrderDetails düğümünün 43 değerine sahip bir ProductID düğümüne sahip olduğu Bir XmlNodeList of Customers düğümlerini döndürmek için bir XPath sorgusu gerçekleştirilir. Temelde, örnek XPath sorgusunu kullanarak ProductID değeri 43 olan ürünü hangi müşterilerin sipariş ettiğini belirler.

' Assumes that connection is a valid SqlConnection.  
connection.Open()  
Dim dataSet As DataSet = New DataSet("CustomerOrders")  
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM Customers", connection)  
customerAdapter.Fill(dataSet, "Customers")  
  
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM Orders", connection)  
orderAdapter.Fill(dataSet, "Orders")  
  
Dim detailAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM [Order Details]", connection)  
detailAdapter.Fill(dataSet, "OrderDetails")  
  
connection.Close()  
  
dataSet.Relations.Add("CustOrders", _  
dataSet.Tables("Customers").Columns("CustomerID"), _  
dataSet.Tables("Orders").Columns("CustomerID")).Nested = true  
  
dataSet.Relations.Add("OrderDetail", _  
  dataSet.Tables("Orders").Columns("OrderID"), _  
dataSet.Tables("OrderDetails").Columns("OrderID"), false).Nested = true  
  
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(dataSet)
  
Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes( _  
  "descendant::Customers[*/OrderDetails/ProductID=43]")  
  
Dim dataRow As DataRow  
Dim xmlNode As XmlNode  
  
For Each xmlNode In nodeList  
  dataRow = xmlDoc.GetRowFromElement(CType(xmlNode, XmlElement))  
  
  If Not dataRow Is Nothing then Console.WriteLine(xmlRow(0).ToString())  
Next  
// Assumes that connection is a valid SqlConnection.  
connection.Open();  
  
DataSet dataSet = new DataSet("CustomerOrders");  
  
SqlDataAdapter customerAdapter = new SqlDataAdapter(  
  "SELECT * FROM Customers", connection);  
customerAdapter.Fill(dataSet, "Customers");  
  
SqlDataAdapter orderAdapter = new SqlDataAdapter(  
  "SELECT * FROM Orders", connection);  
orderAdapter.Fill(dataSet, "Orders");  
  
SqlDataAdapter detailAdapter = new SqlDataAdapter(  
  "SELECT * FROM [Order Details]", connection);  
detailAdapter.Fill(dataSet, "OrderDetails");  
  
connection.Close();  
  
dataSet.Relations.Add("CustOrders",  
  dataSet.Tables["Customers"].Columns["CustomerID"],  
 dataSet.Tables["Orders"].Columns["CustomerID"]).Nested = true;  
  
dataSet.Relations.Add("OrderDetail",  
  dataSet.Tables["Orders"].Columns["OrderID"],  
  dataSet.Tables["OrderDetails"].Columns["OrderID"],
  false).Nested = true;  
  
XmlDataDocument xmlDoc = new XmlDataDocument(dataSet);
  
XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes(  
  "descendant::Customers[*/OrderDetails/ProductID=43]");  
  
DataRow dataRow;  
foreach (XmlNode xmlNode in nodeList)  
{  
  dataRow = xmlDoc.GetRowFromElement((XmlElement)xmlNode);  
  if (dataRow != null)  
    Console.WriteLine(dataRow[0]);  
}  

Ayrıca bkz.