2012-04-30 68 views
5

我有大的DataTable我想獲得這個DataTable表示爲DataTable的子集。 簡要說明如何在DataTable中選擇特定的列。LINQ to DataTable

我是想這樣的事情,但它不工作...

DataTable dTable = new DataTable(); 
... 
... 
... 
     DataTable dt = from field in dTable 
         where field.Field<string>("Manager") 
         where field.Field<string>("Phone") 
         select field; 

也許我的代碼是錯誤的,我怎麼得到「經理人」和「手機」列從一個數據表到另一個不循環思想呢?

+0

你在訪問什麼? SQL? CLR對象? – Tormod

+0

不,我正在訪問DataTable –

+0

你會說你的目的是通過你當前的代碼來幫助你嗎?我不明白你想要什麼(兩個嵌套'where'') –

回答

4

參考的DataTableExtensions -

http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

則...

var whatever = dTable.AsEnumerable(); 
%的MSDN例如

則...

var productNames = from products in table.AsEnumerable() 
     select products.Field<string>("ProductName"); 

編輯/更新:不幸的是我不認爲有一個內置的直接轉換回不同的DataTable NT架構。你有使用DataTable?我相信......因爲重構和測試代碼可能會花費太多精力。祝你好運,並保持我們張貼與強類型的列表更多樂趣

+0

謝謝克里斯!但是我必須得到小的DataTable。 –

+1

@WildGoat:['CopyToDataTable'](http://msdn.microsoft.com/zh-cn/library/bb396189.aspx)是您正在查找的內容。不幸的是,結果DataTable必須與原始DataTable具有相同的模式(字段)。簡言之:這是不可能的。長期版本也適用於任何類型的匿名類型:http://stackoverflow.com/a/9259348/284240 –

2

你可以寫:

var query = from row in dTable.AsEnumerable() 
     select new 
     { 
     manager = row.Field<string>("Manager"), 
     phone = row.Field<string>("Phone")       
     }; 
1

您可以在數據表或特定表上的數據集與AsEnumerable的幫助下執行LINQ查詢。

這裏是一個例子,這可能會有所幫助。

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 
    ds.DataSetName = "products"; 
    dt.TableName = "product"; 

    dc = new DataColumn("product_id",long.MaxValue.GetType()); 
    dt.Columns.Add(dc); 

    dc = new DataColumn("product_name"); 
    dt.Columns.Add(dc); 

    dr = dt.NewRow(); 
    dr["product_id"] = 1; 
    dr["product_name"] = "Monitor"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 2; 
    dr["product_name"] = "Mouse"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 3; 
    dr["product_name"] = "KeyBoard"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 4; 
    dr["product_name"] = "LCD"; 
    dt.Rows.Add(dr); 

    ds.Tables.Add(dt); 

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable() 
            where tbl.Field<long>(0) <= 2 
            select tbl; 

    Response.Write("<b>Query Results 1</b>"); 
    foreach (DataRow row in objResult1) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    } 

    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable() 
            let product_name = tbl.Field<string>(1) 
            where product_name.StartsWith("Key") 
            || product_name.StartsWith("Mo") 
            select tbl; 

    Response.Write("<br/><br/><b>Query Results 2</b>"); 
    foreach (DataRow row in objResult2) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    }