Miércoles, 19 de Marzo de 2008 por climens

LINQ y sintaxis lambda

El otro día fui un poco crítico con la sintaxis de LINQ, así que esta semana he estado curioseando un poco más hasta encontrar que existe una sintaxis alternativa: la sintaxis lambda.

Aun siendo mucho menos cómoda que la nueva sintaxis de consulta en las nuevas versiones de C# y VB.NET, es interesante porque se ve el funcionamiento de las expresiones lambda (fundamentadas en el cálculo lambda) y cómo han sido necesarias para implementar LINQ.

Siguiendo con el ejemplo del artículo anterior, una consulta usando la nueva sintaxis sería algo así (he añadido un order by, para completar):

 
var directors = from movie in movies
                     where movie.Country == "Spain"
                     orderby movie.Year
                     select movie.Director;

Lo importante aquí es que al princpio se declara movie (por eso se hace primero el from, sino sería imposible autocompletar los miembros). Después, se aplica un where, in orderby y un select. Esto, traducido a la version "larga" con expresiones lambda sería:

 
var directors = movies
                     .Where(movie => movie.Country == "Spain")
                     .OrderBy(movie => movie.Year)
                     .Select(movie => movie.Director);

Esto, aunque parezca un poco esotérico simplemente usa el operador lambda => para crear una función nueva implícita que se aplica a movie, siendo movie cada elemento de la colección movies. Cada una de las funciones .Where(), .OrderBy() y .Select() devuelve a su vez una colección de elementos.

Así que esto es lo que hace automáticamente el editor y más adelante el compilador para poder ofrecer una experiencia muy interesante al desarrollador. Aún así, la sintaxis basada en operadores lambda es necesaria cuando lo que deseamos hacer no dispone de una instrucción específica en LINQ.

Después de ver todo esto, ya me gusta un poco más la query syntax y entiendo mejor los motivos por los que se ha hecho como es.

Link | Query Syntax vs Method Syntax

Compartir | meneame | fresqui | del.icio.us | digg | technorati
Tags: , , | 1 comentario

Viernes, 14 de Marzo de 2008 por climens

Primeras impresiones sobre LINQ

Visual Studio 2008Ayer estuve en la presentación de Visual Studio 2008 aquí en Valencia y la segunda charla fue sobre LINQ (Como no tengo la documentación, sólo propaganda, no recuerdo de memoria quién dió la charla, solo que era de Alcoi). Ya había visto algo pero francamente no lo había visto en acción.

Y la verdad es que LINQ me deja un sabor dulce aunque con un toque un poco agrio. Por un lado, es una herramienta muy potente y unificada para acceder a distintos orígenes de datos y colecciones (XML, arrays de objetos, bases de datos...) que además obliga a introducir novedades en C# muy interesantes. Pero sintácticamente no me gusta nada:

var directors = from movie in movies
where movie.Country == "Spain"
select movie.Director;

Y vale. Impresionante en ciertos aspectos: movies puede ser un XML o un array o cualquier cosa y finalmente directors será un array de objetos Director o de strings, según estén definidos en los objetos de la colección movies y además, Intellisense reconocerá los campos de la colección directors y nos permitirá autocompletar y detectar errores en tiempo de compilación.

Pero, ¿era necesaria esta sintaxis? Yo creo que no. Creo que una interfaz fluida (fluent interface) habría sido mucho más interesante desde el punto de vista de mantener la coherencia con el resto del C# (o VB.NET, para el caso es lo mismo) y no habría introducido artefactos de código un tanto forzados.

Por otro lado, no sé hasta qué punto es útil ofrecer facilidades para mezclar código de consultas a la base de datos por la aplicación, ya que en cierto modo fomenta las malas prácticas, pero eso es otro cantar.

Finalmente, no me gusta LINQ to SQL porque volvemos a estar con el mismo problema que con los datasets tipados: un diseñador semiautomático que mapea la base de datos para generar las clases que usará LINQ, pero ¿qué pasa cuando se hacen cambios en la base de datos? El diseñador de datasets era bastante propenso a hacer cosas raras al haber muchos cambios además de que generaba XSDs gigantescos además de los archivos de código asociados. De todos modos sobre esto aún no puedo hablar porque no lo he probado.

En fin, para gustos colores y desde luego que al final acabaré acostumbrándome a todo.Por supuesto, si funciona bien y es tan útil como parece lo usaré. Además están apareciendo proveedores de LINQ para todo, lo que es muy interesante.

Actualización 19/03/08: En el siguiente post, ya me va gustando más la sintaxis y explico algunos de los motivos que hay detrás y cómo funciona.

Compartir | meneame | fresqui | del.icio.us | digg | technorati
Tags: , , , , | 1 comentario