jueves, 18 de agosto de 2011

Distintas sintaxis en LINQ

En LINQ puedes escribir tus consultas de 2 distintas formas.

La primera es a través de la sintaxis de consulta que permite escribir expresiones de consulta al estilo de sentencias SQL. Sin embargo, en tiempo de ejecución estas expresiones de consulta son traducidas a llamadas a métodos.  De este modo, si quieres también puedes escribir consultas LINQ a través de la sintaxis de método (o también llamada sintaxis lambda).

En Internet normalmente se habla de Query Sintax y Method Sintax (es por ello que he traducido literalmente aunque reconozco que los nombres no son muy amigables).

Por ejemplo, las siguientes 2 consultas son idénticas en su resultado, pero la primera utiliza sintaxis de consulta y la segunda sintaxis de método.

Dim consulta =

From p In personas

Where p.Nombre.IndexOf("a") <> -1

Order By p.Nombre Descending

Select p

 

Dim consulta = personas.Where(Function(p) p.Nombre.IndexOf("a") <> -1).OrderByDescending(Function(p) p.Nombre)

 
El propio Microsoft recomienda la sintaxis de consulta por ser más legible y sencilla. Lo cierto es que a mí (que estoy empezando con esto),  también me resulta más sencilla la primera expresión que la segunda.

De hecho, incluso puedes mezclar ambos tipos de sintaxis, por ejemplo:

Dim numero =

(From p In personas

            Where p.Nombre.IndexOf("a") <> -1

            Select p).Count()


Lo que está entre paréntesis es sintaxis de consulta y el método Count() es sintaxis de método.

Además y al hilo de este último ejemplo, también podemos decir que hay ciertos métodos que no tiene equivalente en la sintaxis de consulta, por lo que habrá que utilizar con obligatoriedad la sintaxis de método (por ejemplo Count).

Por otro lado, llevo muchas semanas preparando para este post. Digo esto porque es ahora cuando encajan los métodos extensores y las expresiones lambda. Es decir, la variable “consulta” es del tipo IEnumerable(Of Persona) (recordar que en LINQ to Objects todo es IEnumerable o IEnumerable(Of T)). Siendo así ¿De dónde salen el método Where, OrderByDescending, etc.?  Pues estos métodos son métodos extensores (por fin los encajo en algún sitio) de IEnumerable(Of T) y por supuesto y para terminar de hacerme feliz, reciben un parámetro que es un delegado genérico Func (ya hablamos sobre ello, ¿Recuerdas?) que puede ser reemplazado por una expresión lambda.

Ahora ya sabemos un poquito más de Linq, pero queda un montón!

Un saludo!

No hay comentarios:

Publicar un comentario