2012-04-30 22 views
5

Tengo una gran DataTable. También quiero obtener un subconjunto de esta DataTable representada como DataTable. En pocas palabras, cómo selecciono columnas concretas en DataTable.LINQ to DataTable

yo estaba tratando de algo como esto, pero no funciona ...

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

Tal vez mi código es incorrecto, ¿cómo consigo "gerentes" columnas "teléfono" de un DataTable a otro sin Loop pensó?

+0

¿A qué está accediendo? SQL? Objetos CLR? – Tormod

+0

No, estoy accediendo a DataTable –

+0

¿Diría cuál es su propósito para ayudarlo, con su código actual no puedo entender lo que quiere (dos anidados '¿dónde??) –

Respuesta

4

referencia los DataTableExtensions -

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

Entonces ...

var whatever = dTable.AsEnumerable(); 

continuación por el ejemplo de MSDN ...

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

Editar/actualización: Desafortunadamente yo hago No creo que haya un lanzamiento directo integrado a una DataTable con una diferencia nt esquema. ¿Tiene tiene para usar una DataTable? Lo creo ... ya que puede ser demasiado esfuerzo para refactorizar y probar tu código. Buena suerte y manténgannos informados ya que trabajar con listas fuertemente tipadas es mucho más diversión.

+0

Gracias Kris! Pero tengo que obtener una pequeña DataTable como resultado. –

+1

@WildGoat: ['CopyToDataTable'] (http://msdn.microsoft.com/en-us/library/bb396189.aspx) es lo que está buscando. Desafortunadamente, el DataTable resultante debe tener el mismo esquema (campos) que el DataTable original. En resumen: no es posible. La versión larga que también funciona con cualquier tipo de tipo anónimo: http://stackoverflow.com/a/9259348/284240 –

2

Se puede escribir:

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

Usted puede ejecutar la consulta LINQ en la tabla DataTable o específica conjunto de datos con la ayuda de la AsEnumerable.

Aquí hay un ejemplo que podría ser útil.

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