2013-02-26 86 views
0

我试图从Linq查询中只选择指定字段的数字DataRows,然后使用这些DataRows填充DataTable。问题是,当我将这些DataRows添加到新的DataTable时,我期望分别填充ID和Name字段。但是,DataTable中的ID字段包含ID和名称值。有人能指出我做错了什么吗?从Linq中选择特定的字段查询并填充一个DataTable

下面的代码:

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 
} 
+1

什么问题出在哪里?你能更清楚地描述问题吗,你会得到一个例外吗?什么是“查询”? – 2013-02-26 16:34:11

回答

0

您必须手动行内填充每个电池:

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

MSDN

DataRow newCustomersRow = dataSet1.Tables["Customers"].NewRow(); 

newCustomersRow["CustomerID"] = "ALFKI"; 
newCustomersRow["CompanyName"] = "Alfreds Futterkiste"; 

dataSet1.Tables["Customers"].Rows.Add(newCustomersRow); 

这是你如何将行添加到DataTable

所以你会是这样:

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 
} 
0

我会避免这种方法的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的好处是,你从一个协会与现有的东西分开你的数据,而是它是指存在于仅作为一个集合类。

0

你还没有很好地描述过这个问题。但是,您不应将行添加到不同的DataTables,因为您通常会遇到异常(“行已经属于另一个表”)。

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

我也将使用的Enumerable.Join代替query.Containsfor 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(); 
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); 
} 

//编辑:
我不会推荐这种方式,因为它很大程度上取决于列的正确顺序,而且我甚至不确定是否还有其他情况会如何在混乱中结束=)从其他解决方案中选择一个(至少用于编码)

相关问题