我正在尝试仅使用Linq查询中的指定字段选择数字DataRows,然后使用这些DataRows填充DataTable。问题是,当我将这些DataRows添加到新的DataTable时,我希望分别填充ID和Name字段。但是,DataTable中的ID字段包含ID和Name值。有人能指出我做错了什么。
以下是代码:
var query2 = from s in Tables[Table_Sec].AsEnumerable()
where query.Contains(s["sectype"])
select new { id = s["id"], name = s["name"] }; // I only want these fields
DataTable dt = new DataTable(); // Create my new dataTable
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("name", typeof(string));
foreach(var row in query2)
{
dt.Rows.Add(row); // ID field contains both ID and Name strings. Name field contains nothing
}
答案 0 :(得分:1)
您可以尝试这样做,因为DataRow构造函数允许您传递对象数组
var result = from s in Tables[Table_Sec].AsEnumerable()
where query.Contains(s["sectype"])
select new object[]
{
s["id"],
s["name" ]
};
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("name", typeof(string));
foreach(var row in result)
{
dt.Rows.Add(row);
}
//编辑:
我不推荐这种方式,因为它在很大程度上取决于列的正确顺序,我甚至不确定是否有另一种情况如何最终导致混乱=)从其他解决方案中选择一个(至少对于编码)
答案 1 :(得分:0)
来自MSDN:
DataRow newCustomersRow = dataSet1.Tables["Customers"].NewRow();
newCustomersRow["CustomerID"] = "ALFKI";
newCustomersRow["CompanyName"] = "Alfreds Futterkiste";
dataSet1.Tables["Customers"].Rows.Add(newCustomersRow);
这是向数据表
添加行的方法所以你的意思是:
foreach(var row in query2)
{
var newRow = dt.NewRow();
newRow["id"] = row.id;
newRow["name"] = row.name;
dt.Rows.Add(newRow); // ID field contains both ID and Name strings. Name field contains nothing
}
答案 2 :(得分:0)
您必须手动填充行中的每个单元格:
foreach(var row in query2)
{
var newRow = dt.NewRow();
newRow["id"]= row.id;
newRow["name"]= row.name;
dt.Rows.Add(newRow);
}
答案 3 :(得分:0)
我会避免使用此方法的数据表,并使用POCO,Plain Old Class Object。
public class POCO
{
public string id { get; set; }
public string name { get; set; }
}
var query2 = from s in Tables[Table_Sec].AsEnumerable()
where query.Contains(s["sectype"])
select new POCO { id = s["id"], name = s["name"] };
POCO的优点是您可以将数据与现有关联的数据分开,而是将其引用到仅作为集合存在的类。
答案 4 :(得分:0)
你没有很好地描述这个问题。但是,您不应该向不同的DataTables
添加行,因为您通常会收到异常(“Row已经属于另一个表”)。
您应该使用强类型字段扩展方法,以确保在选择对象时不会错误地使用ReferenceEquals
。如果Linq查询包含CopyToDataTable
,您可以使用DataTable
创建新的IEnumerable<DataRow>
。
我还会使用Enumerable.Join
代替query.Contains
for performance reasons:
var query2 = from secRow in Tables[Table_Sec].AsEnumerable()
join sectype in query on secRow.Field<string>("sectype") equals sectype
select secRow;
DataTable dt = query2.CopyToDataTable();