如何转换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();
答案 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});
但您只对一个或多个列中的DataTable
感兴趣,但不是全部,您只需使用DataView
:
var nameOnlyTable = new DataView(dt).ToTable(false, new []{"Name"});
不需要LINQ。