C# 从Linq查询中选择特定字段并填充数据表

C# 从Linq查询中选择特定字段并填充数据表,c#,linq,C#,Linq,我试图从Linq查询中选择一个只包含指定字段的数据行,然后使用这些数据行填充数据表。问题是,当我将这些数据行添加到新的数据表中时,我希望分别填充ID和Name字段。但是,DataTable中的ID字段同时包含ID和Name值。有人能指出我做错了什么吗 代码如下: var query2 = from s in Tables[Table_Sec].AsEnumerable() where query.Contains(s["sectype"]) s

我试图从Linq查询中选择一个只包含指定字段的数据行,然后使用这些数据行填充数据表。问题是,当我将这些数据行添加到新的数据表中时,我希望分别填充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
}
发件人:

这是向数据表添加行的方式

所以你的想法是:

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
}

必须手动填充行中的每个单元格:

foreach(var row in query2)
{
    var newRow = dt.NewRow();
    newRow["id"]= row.id;
    newRow["name"]= row.name;
    dt.Rows.Add(newRow);
}

对于这个方法,我将避免使用Datatable,而使用POCO,即普通的旧类对象

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的优点是将数据与现有的关联分离开来,并将其引用到一个仅作为集合使用的类

你没有很好地描述这个问题。但是,不应将行添加到不同的
数据表中,因为通常会出现异常(“行已属于另一个表”)

您应该使用强类型字段扩展方法来确保在选择对象时不会错误地使用
ReferenceEquals
。当Linq查询包含
IEnumerable
时,可以使用
CopyToDataTable
从Linq查询创建新的
DataTable

我还将使用
Enumerable.Join
而不是
query.Contains

var query2=from表[Table_Sec]中的secRow.AsEnumerable()
在secRow上的查询中加入sectype。字段(“sectype”)等于sectype
选择secRow;
DataTable dt=query2.CopyToDataTable();

您可以尝试这样做,因为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); 
}
//编辑:

我不建议采用这种方式,因为这在很大程度上取决于列的正确顺序,我甚至不确定是否还有其他情况会导致混乱=)从其他解决方案中选择一种(至少在编码方面)

出了什么问题?你能更清楚地描述这个问题吗?你有例外吗?什么是
查询
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();
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); 
}