2012-04-30 13 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; 

はたぶん私のコードは、私はせずに別のDataTableをから「管理職」と「電話」の列を得るのですか、間違っていますそれを考えてループ?

+0

何をアクセスしていますか? SQL? CLRオブジェクト? – Tormod

+0

いいえ、私はDataTableにアクセスしています –

+0

あなたの現在のコードで、あなたが望むものを理解することができません(2つのネストされた '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に直接キャストされているとは思わないスキーマ。あなたはにDataTableを使用するのにを持っていますか?私はそれを信じています...あなたのコードをリファクタリングしてテストするには多大な努力が必要かもしれません。強く型付けされたリストを使って作業することが幸運であり、私たちに投稿され続けることは、はるかに多いです。

+0

ありがとうクリス!しかし、結果として小さなDataTableを取得する必要があります。 –

+1

@ WildGoat:['CopyToDataTable'](http://msdn.microsoft.com/en-us/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の助けを借りたDataSetにDataTableのか、特定のテーブルの上に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))); 
    }