2012-02-29 8 views
9

Estaba trabajando con una DataTable y noté que Resharper me recomendó que puedo convertir un bucle en una expresión LINQ. Así lo hice y fue reescrito en la sintaxis de expresión de consulta (simplificado):LINQ - Método vs diferencia de sintaxis de consulta

var test1 = from DataRow row in dt.Rows select row; 

Personalmente, prefiero sintaxis del método por lo reescribió a esto:

var test2 = dt.Rows.Select(row => row); 

y se rompió.

'System.Data.DataRowCollection' no contiene una definición de 'Seleccionar' y ningún método de extensión 'Seleccionar' aceptar un primer argumento de tipo 'System.Data.DataRowCollection' se pudo encontrar (¿falta una directiva using o una referencia de ensamblado?)

Dado que la expresión de consulta son translated to method calls, ¿por qué es que los primeros trabajos, pero no la segunda? Esperaba que ambos o ninguno de los dos funcionara, lo cual obviamente no es el caso.

Respuesta

12

La primera tiene una variable de rango escrito de forma explícita, por lo que es en realidad compilado a:

var test2 = dt.Rows.Cast<DataRow>(); 

(No hay necesidad de que el Select Como se trata de una expresión consulta degenerada (el Select es un no-op .)

Una alternativa es llamar AsEnumerable de DataTableExtensions creo que puede haber algunos ventajas de rendimiento en eso, pero sólo en algunos casos:.

var test2 = dt.AsEnumerable(); 
+2

Lo cual es necesario porque 'DataRowCollection' implementa' IEnumerable', no 'IEnumerable '. –

+1

@ChrisShouts: Ah, me había dado cuenta de esto antes, pero nunca entendí exactamente por qué. El hecho de que implementa el "incorrecto" IEnumerable es lo que me faltaba. :) – Chris

Cuestiones relacionadas