LINQ导致DataRow

时间:2017-02-21 05:32:29

标签: c# linq datatable

我有一个XML,我使用LINQ to XML。因为我想捕获一些元素/属性数据,所以我把它们放在一个字符串数组中。后来我使用foreach循环将这些值从字符串数组插入到DataRow中;因为我的最终目标是从中获取DataTable。

以下是我的代码

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

是否可以组合这些并直接从LINQ查询获取输出作为DataTable而不是使用foreach?

我可以使用select new string[]select new DataTable的实例来代替DataTable吗?

我知道我的表结构应该是固定的。

更新

谢谢@CodingDawg& @Rahul Singh,我现在想知道这两者之间的最佳方法。

我将检查我的样本数据以进行比较。

但根据您的经验,哪一个更好地考虑大数据(10000个元素=> 10000行)?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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));