2017-02-21 22 views
1

У меня есть XML, для которого я использовал LINQ to XML. Поскольку я хотел захватить некоторые данные элемента/атрибута, я взял их в массив строк. Позже я использовал цикл foreach для вставки этих значений из строкового массива в DataRow; поскольку моей конечной целью является получение DataTable.Результат LINQ в DataRow

Ниже мой код

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

ли можно комбинировать эти и непосредственно получить результат, как DataTable из запросов LINQ вместо использования Еогеаспа?

Вместо select new string[] можно использовать что-то вроде select new DataTable или экземпляр DataTable?

Я понимаю, что моя структура таблицы должна быть исправлена.

Update

Благодаря @CodingDawg & @Rahul Сингх, сейчас я хотел бы знать, лучший подход между этими двумя.

Я буду проверять наличие данных для сравнения.

Но из вашего опыта, который лучше рассмотреть большие данные (10000 элементов => 10000 строк)?

+0

Вы пробовали загрузки XML в DataSet? Из этого вы должны получить доступный 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 к XML, вы можете проецировать DataTable непосредственно без используя Еогеасп петли следующим образом: -

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