LINQ - Método vs Sintaxis de Consulta de Diferencia
-
14-11-2019 - |
Pregunta
Yo estaba trabajando con un DataTable y notó que Resharper me recomendó que puede convertir un bucle en una expresión LINQ.Así lo hice y fue reescrito en la expresión de consulta de sintaxis (simplificado):
var test1 = from DataRow row in dt.Rows select row;
Personalmente, prefiero la sintaxis de método para reescribió a este:
var test2 = dt.Rows.Select(row => row);
Y se rompió.
'Sistema.De datos.DataRowCollection' no contiene una definición para 'Seleccionar' y no método de extensión 'Seleccionar' aceptar un primer argumento de tipo 'System.De datos.DataRowCollection' podría ser encontrado (¿falta una directiva using o una referencia de ensamblado?)
Desde la expresión de consulta son traducido a las llamadas de método, ¿por qué es que la primera funciona, pero no el segundo?Me lo esperaba de cualquiera de los dos o ninguno para el trabajo que obviamente no es el caso.
Solución
La primera tiene un explícito de la variable de rango, por lo que es realmente compilado:
var test2 = dt.Rows.Cast<DataRow>();
(No hay necesidad para la Select
como este es un degenerados expresión de consulta (el select es un no-op.)
Una alternativa es llamar a AsEnumerable
de DataTableExtensions
.Creo que puede ser de algunos beneficios de rendimiento en eso, pero sólo en algunos casos:
var test2 = dt.AsEnumerable();