如何将选择DataTable的某些列的LINQ查询的结果再次转换为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();发布于 2014-04-07 18:34:30
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;
因为您的查询返回一个IEnumerable<'DataRow>,所以CopyToDataTable()可用。
但在第二种情况下,var data = from r in dtN.AsEnumerable() select new { Name = r["Name"].ToString() };
返回的是匿名类型。匿名类型不带有CopyToDataTable()的扩展方法。
如果您希望将非datatable派生的T转换为datatable,MSDN有一个示例类可以反映出任何类型并执行转换。Please Read this link
发布于 2014-04-08 16:35:12
如果你有一个有很多列的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});

但是您只对其中一列或某些列中的DataTable感兴趣,而不是所有列,您可以简单地使用DataView
var nameOnlyTable = new DataView(dt).ToTable(false, new []{"Name"});

不需要LINQ。
https://stackoverflow.com/questions/22909327
复制相似问题