2008-10-25 13 views
57

Estoy intentando realizar una consulta LINQ simple en la propiedad Columns de un DataTable:Consulta DataColumnCollection con LINQ

from c in myDataTable.Columns.AsQueryable() 
    select c.ColumnName 

Sin embargo, lo que me pasa es lo siguiente:

No se pudo encontrar una implementación del patrón de consulta para el tipo de fuente 'System.Linq.IQueryable'. 'Seleccionar' no encontrado. Considere especificar explícitamente el tipo de la variable de rango 'c'.

¿Cómo puedo obtener el DataColumnCollection para jugar bien con LINQ?

Respuesta

100

¿Qué tal:

var x = from c in dt.Columns.Cast<DataColumn>() 
     select c.ColumnName; 
+2

@Dave: ¿Qué causa este problema en primer lugar? ¿Cómo es que tenemos que hacer el Cast()? –

+16

Es porque dt.Columns es un IEnumerable, pero no un IEnumerable . Es solo una función del hecho de que la clase es un poco más antigua y no implementa el nuevo tipo genérico. Cuando envía <>(), lo transfiere a un IEnumerable donde se definen los métodos de extensión. –

12

También es posible usar:

var x = from DataColumn c in myDataTable.Columns 
     select c.ColumnName 

que va a hacer efectivamente el mismo que el código de Dave: "en una expresión de consulta, una variable de iteración escrito explícitamente se traduce en una invocación de Cast (IEnumerable) ", según el artículo Enumerable.Cast<TResult> Method de MSDN.