2017-02-21 2 views
1

Ich habe eine XML, für die ich LINQ to XML verwendet habe. Da ich einige der Element-/Attributdaten erfassen wollte, habe ich sie in einem String-Array aufgenommen. Später habe ich eine foreach-Schleife benutzt, um diese Werte vom String-Array in eine DataRow einzufügen; als mein Ziel ist es, eine DataTable daraus zu machen.LINQ Ergebnis in DataRow

Im Anschluss an meinem Code

System.Data.DataTable dt = new System.Data.DataTable(); 

    dt.Columns.Add("col_1"); 
    dt.Columns.Add("col_2"); 
    dt.Columns.Add("col_3"); 
    string[] arr = new string[3]; 

    var myData = from n in doc.Descendants("product") 
      select new string[]{ 
       arr[0] = n.Attribute("name").Value, 
       arr[1] = n.Attribute("prodid").Value, 
       arr[2] = n.Attribute("price").Value 
      }; 

    foreach (var item in myData) 
    { 
     dt.Rows.Add(item[0],item[1],item[2]); 
    } 

Ist möglich ist, diese zu kombinieren und direkt eine Ausgabe als Datentabelle von LINQ-Abfrage anstelle der Verwendung von foreach zu bekommen?

Anstelle von select new string[] kann ich etwas wie select new DataTable oder eine Instanz von DataTable verwenden?

Ich verstehe, dass meine Tabellenstruktur sollte behoben sein.

aktualisieren

Dank @CodingDawg & @Rahul Singh, würde ich jetzt den besten Ansatz zwischen diesen beiden wissen.

Ich werde nach meinen Beispieldaten suchen, um dasselbe zu vergleichen.

Aber aus Ihrer Erfahrung, welche ist besser bei großen Daten (10000 Elemente => 10000 Zeilen)?

+0

Haben Sie versucht, die XML in ein DataSet geladen? Sie sollten eine brauchbare DataTable daraus erhalten. – tinstaafl

+0

@tinstaafl - Ich kann XML nicht direkt in DataSet laden, da einige Schritte erforderlich sind. Wollte auch überprüfen, ob der obige machbar ist. – A3006

Antwort

0

Verwenden Sie die Linq .ToList(). Foreach() -Funktionen

System.Data.DataTable dt = new System.Data.DataTable(); 

dt.Columns.Add("col_1"); 
dt.Columns.Add("col_2"); 
dt.Columns.Add("col_3"); 

doc.Descendants("product") 
      .ToList() 
      .ForEach(
       n => dt.Rows.Add(n.Attribute("name").Value, 
           n.Attribute("prodid").Value, 
           n.Attribute("price").Value)); 
+0

Ich wusste nicht, dass wir .ForEach so haben können. Vielen Dank. +1 dafür. – A3006

3

Es gibt Art und Weise gesamte XML in DataSet zu laden, aber ich denke, Sie einige spezifische Werte brauchen und müssen auch so einige benutzerdefinierte Filterung oder stopft tun Sie verwenden Linq-to-XML, können Sie die Datentabelle Projekt direkt ohne Verwendung foreach Schleife wie folgt aus: -

DataTable myData = doc.Descendants("product") 
         .Select(x => 
         { 
          var row = dt.NewRow(); 
          row.SetField<string>("col_1", (string)x.Attribute("name")); 
          row.SetField<string>("col_2", (string)x.Attribute("prodid")); 
          row.SetField<string>("col_1", (string)x.Attribute("price")); 
          return row; 
         }).CopyToDataTable(); 

myData wird die resultierende datatable halten.

+0

Danke, ich werde das versuchen. – A3006