2010-03-23 33 views
2

我想在DataTable上執行LINQ查詢並在另一個DataTable中顯示結果。我的源數據表看起來是這樣的:LINQ查詢到DataTable.DataSource

DataTable myDataTable = new DataTable(); 
myDataTable.Columns.Add("OrderID", typeof(int)); 
myDataTable.Columns.Add("Date", typeof(DateTime)); 
myDataTable.Columns.Add("UnitsPurchased", typeof(int)); 

結果DataTable看起來像這樣充滿時:

 
Order ID Date Units Purchased 
16548 10/15/09  250 
17984 11/03/09  512 
20349 01/11/10  213 
34872 01/15/10  175 

我現在的LINQ查詢看起來是這樣的:

IEnumerable<DataRow> query = (from row in myDataTable.AsEnumerable() 
           where row.UnitsPurchased > 200 
           select new 
           { 
           row.OrderID, 
           row.Date, 
           row.UnitsPurchased 
           }) as IEnumerable<DataRow>; 

resultDataTable.DataSource = query.CopyToDataTable<DataRow>(); 

我每次運行此代碼查詢爲空。我可以看到as IEnumerable<DataRow>是罪魁禍首,但是由於DataTable.AsEnumerable()返回IEnumerable<DataRow>,所以對我沒有幫助。任何幫助,將不勝感激。

回答

3

當您選擇新{}時,您實際上得到的是IEnumerable<(Anonymous Type)>,而不是IEnumerable<DataRow>。所以你的as IEnumerable<DataRow>將返回null,因爲它不能被直接轉換。

要麼select new MyDataRow(constructor using values...)什麼,要麼只是做var query =...沒有as演員。有一個msdn article關於使用CopyToDataTable與非DataRow泛型參數,雖然我沒有深入閱讀它,但選擇新的DataRows可能是更簡單的解決方案。

-1

爲什麼你必須創建一個新的匿名類型。當你可以簡單地做到這一點。

DataTable myDataTable = new DataTable(); myDataTable.Columns.Add("OrderID", typeof(int)); myDataTable.Columns.Add("Date", typeof(DateTime)); myDataTable.Columns.Add("UnitsPurchased", typeof(int));

 var datarow1 = myDataTable.NewRow(); 
     datarow1.SetField("OrderID", 16548); 
     datarow1.SetField("Date", DateTime.Parse("10/10/09")); 
     datarow1.SetField("UnitsPurchased", 250); 

     var datarow2 = myDataTable.NewRow(); 
     datarow2.SetField("OrderID", 17984); 
     datarow2.SetField("Date", DateTime.Parse("11/03/09")); 
     datarow2.SetField("UnitsPurchased", 512); 

     var datarow3 = myDataTable.NewRow(); 
     datarow3.SetField("OrderID", 20349); 
     datarow3.SetField("Date", DateTime.Parse("01/11/10")); 
     datarow3.SetField("UnitsPurchased", 213); 

     var datarow4 = myDataTable.NewRow(); 
     datarow4.SetField("OrderID", 34872); 
     datarow4.SetField("Date", DateTime.Parse("10/01/10")); 
     datarow4.SetField("UnitsPurchased", 175); 


     myDataTable.Rows.Add(datarow1); 
     myDataTable.Rows.Add(datarow2); 
     myDataTable.Rows.Add(datarow3); 
     myDataTable.Rows.Add(datarow4); 

     var filteredTable = myDataTable.AsEnumerable().OfType<DataRow>().Where(row => row.Field<int>("UnitsPurchased") > 200).Select(r => r); 

     resultDataTable.DataSource = filteredTable.CopyToDataTable(); 

+0

-1 - 這不是 「簡單」;這是一個**可怕的** kludge!你怎麼能把這種黑客推向一個毫無戒心的程序員? – 2010-09-22 08:41:48