将结果集转换为Datatable

时间:2014-04-07 10:06:24

标签: c# linq datatable

如何转换LINQ查询的结果,我再次选择DataTable的某些列到DataTable

DataTable dtN = new DataTable();

dtN.Columns.Add("Id");   
dtN.Columns.Add("Name");
dtN.AcceptChanges();

for (int i = 1; i <= 10; i++)
{
    DataRow dr = dtN.NewRow();
    dr["Id"] = i;  
    dr["Name"] = "A"+i.ToString();
    dtN.Rows.Add(dr);
    dtN.AcceptChanges();
}

var data = from r in dtN.AsEnumerable()
           select new { Name = r["Name"].ToString() };

//this line is giving error because CopyToDatatable is not available
DataTable dt = data.CopyToDataTable();

2 个答案:

答案 0 :(得分:2)

DataTable dtN = new DataTable();

dtN.Columns.Add("Id");
dtN.Columns.Add("Name");
dtN.AcceptChanges();

for (int i = 1; i <= 10; i++)
{
    DataRow dr = dtN.NewRow();
    dr["Id"] = i;
    dr["Name"] = "A" + i.ToString();
    dtN.Rows.Add(dr);
    dtN.AcceptChanges();
}

var data = from r in dtN.AsEnumerable()
            select new { Name = r["Name"].ToString() };

DataTable dt = new DataTable();
dt.Columns.Add("Name");
foreach(var s in data)
{
    DataRow dr = dt.NewRow();
    dr["Name"] = s.Name;
    dt.Rows.Add(dr);
    dt.AcceptChanges();
}
//DataTable dt = data.CopyToDataTable();

编辑:  CopyToDataTable()仅适用于IEnumerable<T>,其中T是DataRow或来自var data=from r in dtN.AsEnumerable() select r;

首先是CopyToDataTable()

IEnumerable<'DataRow>可用,因为您的查询返回var data = from r in dtN.AsEnumerable() select new { Name = r["Name"].ToString() };

但在第二种情况下CopyToDataTable()

您要返回匿名类型。 匿名类型不包含{{1}}的扩展方法。

如果您希望将非数据表导出的T转换为数据表,MSDN会有一个反映任何类型并执行转换的示例类。Please Read this link

答案 1 :(得分:0)

如果您的DataTable列有很多列:

var dt = new DataTable();
dt.Columns.Add("Foo",  typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Bar",  typeof(int));

dt.Rows.Add(new object[]{"Foo",  "Max",   555});
dt.Rows.Add(new object[]{"Blub", "Marry", 123});
dt.Rows.Add(new object[]{"Bla",  "Mac",   999});

enter image description here

但您只对一个或多个列中的DataTable感兴趣,但不是全部,您只需使用DataView

var nameOnlyTable = new DataView(dt).ToTable(false, new []{"Name"});

enter image description here

不需要LINQ。