2017-02-21 15 views
1

私はXMLにLINQ to XMLを使用しています。要素/属性データの一部を取得したいので、文字列配列で取得しました。後で、これらの値を文字列配列からDataRowに挿入するためにforeachループを使用しました。私の最終的な目標はDataTableをそこから得ることです。続きDataRowのLINQ結果

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]); 
    } 

私のコードはありこれらを組み合わせて、代わりに、直接のforeachを使用してのLINQクエリからのDataTableとして出力を得ることが可能でしょうか?

select new string[]の代わりに、select new DataTableまたはDataTableのようなものを使用できますか?

私は自分のテーブル構造を修正する必要があることを理解します。

更新

おかげで、私は今、これら二つの間の最善のアプローチを知りたいのですが、& @Rahulシンを@CodingDawg。

私のサンプルデータが同じかどうかを確認します。

大規模なデータ(10000要素=> 10000行)を考えるとあなたの経験から、

+0

を機能あなたは、DataSetにXMLをロードしようとしたことがありますか?あなたはそれから有用なDataTableを取得する必要があります。 – tinstaafl

+0

@tinstaafl - XMLをDataSetに直接ロードすることはできません。また、上記のものが実現可能かどうかを確認したいと考えました。 – A3006

答えて

0

は(LINQの.ToListを使用してください)。foreachの()は

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

私は私たちが持っていることを知りませんでした。ありがとう。これは+1です。 – A3006

3

XML全体をDataSetにロードする方法がありますが、いくつかの特定の値が必要で、カスタムフィルタリングやデータ処理が必要な場合もあります。Linq-to-XMLを使用すると、ループこのようのforeachを使用して: -

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が生じたのdataTableを開催します。

+0

ありがとう、私はこれを試してみます。 – A3006