2013-02-26 67 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); 
} 

//編輯:
我不會推薦這種方式,因爲它很大程度上取決於列的正確順序,而且我甚至不確定是否還有其他情況會如何在混亂中結束=)從其他解決方案中選擇一個(至少用於編碼)

相關問題