从Linq查询中选择特定字段并填充DataTable

时间:2013-02-26 16:30:26

标签: c# linq

我正在尝试仅使用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
}

5 个答案:

答案 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();