Linq es un paradigma de programación que me ha encantado desde su primera versión. Tener un lenguaje que me abstraiga de las particularidades de la fuente de datos y que me permita realizar las mismas operaciones en diferentes sistemas sin tener que cambiar la sintaxis ni la gramática, es de gran valor en estos momentos.
Por ello cuando ha llegado a mi conocimiento el desarrollo de librerías que me permiten utilizar Linq sobre repositorios Javascript (o jQuery), inmediatamente me he configurado mi Visual Studio 2010 y me he puesto a probarlas. Llegando a la conclusión que ahora mismo la más recomendable es linq.js. Que, además, es Open Source y plenamente libre de utilizar según su licencia BSD.
Instalación
El primer paso es crear un proyecto del tipo MVC3. Me da igual que sea vacío, o con la plantilla predeterminada. Ya que yo solamente voy a utilizar una vista para hacer las pruebas.
Una vez creado el mismo abro mi gestor de paquetes NuGet y busco por el término “linq.js”, saliéndome las tres librerías que han publicado: el core, el plugin para jQuery y la de Bindings. Como lo estoy haciendo por NuGet no debo preocuparme por la instalación de los pre-requisitos, como es el tener instalado jQuery en el caso del plugin. Lo hace solo el sistema y me crea las referencias.
Por último abro la vista de Index.cshtml y creo la referencia a la biblioteca javascript. Esto lo podría poner en el ViewStart del proyecto, pero por comodidad para hacer las pruebas la he puesto en local.
<script src="../../Scripts/linq.js" type="text/javascript"></script>
Picando código
Para probar como funciona primero creo una variable en donde cargo un array de números. Así ya tengo el repositorio de datos al que atacar.
var lista = [1, 2, 3, 4, 5]; // Cargo los datos enun array
A continuación replico uno de los ejemplos que hay en los vídeos del proyecto en donde utilizo un objeto Enumerable para realizar un bucle por todos los miembros del array de datos y lanzo una función que me muestra una alerta con el valor de miembro.
var lista = [1, 2, 3, 4, 5]; // Cargo los datos en un array
// Realizo un ForEach y lanzo un alert por cada miembro del array
Enumerable.From(lista).ForEach(function(i)
{alert(i);});
De esta pieza de código saco varias conclusiones. La integración con Visual Studio 2010 es muy buena y el Intellisense también. Lo único que hay que tener cuidado es que estamos trabajando en JavaScript y este es sensible a las Mayúsculas. Por lo cual el método ForEach, lo encuentra, pero forEach no. Otra cosa es que es ligeramente diferente a Linq en C#. Una estructura como la que acabo de escribir no la hubiera echo así en mi código. Pero JS y en especial jQuery tiene su forma de hacer las cosas y funciona muy bien.
Pero quiero hacer algo sencillito que sea más cercano a lo que se hacer en Linq y por ello selecciono los miembros del array que sean igual o mayores que tres y lo cargo en otra variable. A continuación lanzo una alerta en donde visualizo el número de miembros que contiene esta nueva variable.
var lista = [1, 2, 3, 4, 5]; // Cargo los datos en un array
// Selecciono los miembro del array que cumplen la condición y los cargo en una variable
var numero = Enumerable.From(lista)
.Where(“p => p > 3”)
.Select();
// Visualizo el número de miembro de la variable numero.
alert(‘El número total de unidades mayor o igual que 3 es: ‘ + numero.Count());
De aquí saco conclusiones más profundas. Permite expresiones lambda; permite una codificación muy similar a la de linq en C# y hace lo que quiero que haga. Además, tirando de Intellisense, veo que hay un montón de funciones interesantes y que van más allá de lo que tenemos en .Net 4.
Conclusiones
Una herramienta muy buena. Prácticamente imprescindible en estos tiempos de html5 con las posibilidades de repositorio de datos local y que requieren el manejo de datos en el cliente. Es tan sencilla y compleja como lo es linq en C#. Pero a mí, que no es que sea muy amante de JS, me facilita mucho la vida.
Además, los autores no se han quedado en las capacidades del Linq en C#, si no que han incluido funciones de otros lenguajes para crear una libreria de más de 90 métodos.
Más información: linq.js en Codeplex