2012-04-30 15 views
5

Ich habe große DataTable Ich möchte Teilmenge dieser DataTable entweder als DataTable dargestellt werden. Kurz gesagt, wie wähle ich bestimmte Spalten in DataTable.LINQ to DataTable

Ich war so etwas wie dies versucht, aber es funktioniert nicht ...

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

Vielleicht falsch mein Code ist, wie kann ich „Manager“ und „Phone“ Spalten von einer Datentabelle zum anderen gelangen, ohne Looping dachte es?

+0

Auf was greifen Sie zu? SQL? CLR-Objekte? – Tormod

+0

Nein, ich greife auf DataTable zu –

+0

Würden Sie sagen, was ist Ihr Zweck, um Ihnen zu helfen, durch Ihren aktuellen Code kann ich nicht verstehen, was Sie wollen (zwei geschachtelte 'wo'?) –

Antwort

4

Referenz die Datatableextensions -

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

Then ...

var whatever = dTable.AsEnumerable(); 

Dann pro MSDN Beispiel ...

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

Bearbeiten/Update: Leider ich tun Ich glaube nicht, dass es eine direkte Umwandlung in eine DataTable mit einer anderen Instanz gibt nt Schema. Sie haben , um eine DataTable zu verwenden? Ich glaube es ... es könnte zu viel Aufwand sein, um den Code zu überarbeiten und zu testen. Viel Glück und halten Sie uns auf dem Laufenden, wie die Arbeit mit stark typisierten Listen sind viel mehr Spaß.

+0

Danke Kris! Aber ich muss als Ergebnis eine kleine DataTable bekommen. –

+1

@WildGoat: ['CopyToDataTable'] (http://msdn.microsoft.com/en-us/library/bb396189.aspx) ist, was Sie suchen. Leider muss die resultierende DataTable das gleiche Schema (Felder) wie die ursprüngliche DataTable haben. Kurz: Es ist nicht möglich. Die lange Version, die auch mit jeder Art von anonymen Typen funktioniert: http://stackoverflow.com/a/9259348/284240 –

2

könnten Sie schreiben:

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

Sie LINQ-Abfrage auf Datatable oder mit Hilfe des AsEnumerable auf DataSet Spezifische Tabelle ausführen kann.

Hier ist ein Beispiel, das hilfreich sein könnte.

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))); 
    }