11.24.2011

Linq: TakeWhile y OrderBy

Trabajando con Linq, me ha tocado manipular colecciones de objetos en donde se deben aplicar condiciones a grupos de objetos o procesar objetos mientras se cumpla alguna condición. Un método que sin duda me llamó la atención es el TakeWhile el cual permite procesar los elementos mientras se cumpla la condición dada, si esta condición no se cumple, se descartan todos los elementos a partir del primero que no la cumpla.

Por ejemplo, queremos procesar la lista de productos cuyo precio sea menor de 500, todo esto basado en la siguiente clase de producto.

image

La lista de productos a procesar es la siguiente:

image

Ahora para poder cumplir con la condición inicial –> procesar los productos que cuestan menos de 500 <—y considerando que el método takeWhile detiene su procesamiento cuando la condición no se cumple, debemos ordenar la lista de productos retornada por precio, luego de esto vamos a aplicar el TakeWhile. Luego procedemos a retornar la lista resultante.

image

Al ejecutar el código anterior obtenemos el siguiente resultado:

image

Etiquetas de Technorati: ,,

11.12.2011

Aprendiendo WF parte 7– Excepciones (1)

Continuando con nuestras serie de post acerca de WF, en esta ocasión nos vamos a enfocar en el manejo de excepciones dentro del workflow. Para esto, vamos a utilizar el workflow del post anterior para manejar las excepciones.

Provocando el error en el workflow

Nuestro ejemplo asume que la lista que viene como parámetro de entrada siempre viene inicializada, es decir ya esta instanciada, pero que pasaría si nos envía una lista nula? Para ver que pasaría vamos a cambiar el código en el programa de consola de la siguiente forma:

image Ahora si ejecutamos la aplicación, vamos a obtener el siguiente mensaje de error:

image

Como podemos ver en la figura anterior, la excepción se lanzo desde el workflow y nosotros no tenemos la más mínima idea de lo que puede estar ocurriendo. Aquí es donde entra el manejo de excepciones.

Agregando Excepciones al Workflow

Vamos a manejar la excepción anterior dentro del workflow utilizando las actividades que workflow foundation ya tiene construidas para tal propósito. Las mismas se pueden ver en la siguiente figura:

image

Primero vamos a agregar una figura TryCatch para meter nuestro código dentro de este. Luego dentro de la secuencia del try vamos a agregar nuestro código para manipular las colecciones.

image

Como vemos en la figura anterior tenemos un error en el workflow – signo de admiración – lo cual es provocado porque no hemos configurado el catch del bloque para el manejo de errores. Para reparar este problema vamos a agregar una excepción genérica del tipo System.Exception para procesar todos los errores que se den dentro del bloque en un solo lugar.

image

Luego hacemos click en la superficie del workflow y nos queda a disposición el bloque de catch para manejar la excepción. En la parte derecha del bloque esta el nombre de la instancia en donde vendrá encapsulada la excepción.

image

Para este ejemplo simplemente vamos a relanzar la excepción y vamos a poner un mensaje un poco más “legible” para que a la hora de manejarlo del lado del cliente se tenga una mejor noción del problema. Para esto vamos a agregar una figura de rethrow y la vamos a configurar con la instanciación de una nueva excepción y de un mensaje indicando el problema de forma general.

image

Para esto vamos a ir a las propiedades de la figura rethrow y le vamos a agregar el siguiente código.

image

Ahora nuestro workflow lucirá de la siguiente manera.

image

El siguiente paso es manejar la excepción del lado del programa para esto vamos a agregar el siguiente código del cliente de la consola.

image

Cuando ejecutamos el código anterior vamos a obtener el siguiente resultado.

image

Etiquetas de Technorati: ,

11.02.2011

Aprendiendo WF parte 6: Trabajando con colecciones en WF

Siguiendo con nuestros posts acerca de WF, vamos a trabajar con colecciones en los workflows de Workflow Foundation, algo que también será muy común en nuestras aplicaciones n-layer ya que normalmente trabajamos con colecciones de entidades.

Colecciones como Parámetros

Es muy común utilizar colecciones de objetos para llevar a cabo procesos de negocios en nuestra empresa a través de los productos que día a día desarrollamos. Por ejemplo, vamos a requerir una colección de clientes cuando deseamos hacer una consulta de clientes, o una colección de productos cuando queremos ver los productos de una categoría específica. Como era de suponerse, en el workflow foundation podemos recibir, procesar y retornar colecciones de objetos.

En este post vamos a crear una colección de productos los cuales tienen la siguiente estructura.

image

En el ejemplo que estamos por construir, vamos a recibir una colección de Productos, la vamos a procesar y luego vamos a retornar todos los productos que están exonerados. Para esto vamos a crear un nuevo Workflow que se llame WfProcesarProductosExonerados y en este workflow vamos a crear dos parámetros:

  1. ProductosRecibidos: Colección de productos a procesar –> List<Producto>: Ingreso.
  2. ProductosExonerados: Colección de productos que están exonerados –> List<Producto>: Retorno.

Para crear la primera lista, seleccionamos en el tipo del argumento la opción Browse For Types. Luego nos aparecerá un diálogo en donde vamos a seleccionar – buscando – el tipo List<T>.

image

En esta lista procedemos a seleccionar el tipo que queremos asignarle a T, para esto procedemos a seleccionar de la lista desplegable la opción “Browse For Types” de nuevo. En esta opción seleccionamos la clase Producto.

image

Para la lista de retorno, solamente tenemos que expandir la lista del tipo y ya nos aparecerá disponible List<Producto> como tipo para elegir.

image

Ahora procedemos a crear el workflow. En este caso vamos a recibir la lista de productos – pProductosRecibidos – y la vamos a recorrer. Por cada producto vamos a preguntar si el producto esta exonerado, si es así procedemos a agregarlo a la nueva lista de retorno. El workflow completo se puede ver a continuación.

image

Es importante notar que para poder agregar los productos a la nueva lista, esta debe de ser instanciada antes de poder ser utilizada, tal y como se ve en la siguiente figura.

image

Igualmente es importante destacar que la estructura de ForEach debe de ser tipificada para que compile. Esto se logra cambiándole la propiedad TypeArgument del ForEach.

image

También se debe de utilizar la figura para agregar elementos a una colección. Esta figura debe de ser configurada con el ítem que se desea agregar –> en nuestro caso el item del foreach – y la colección a la que deseo agregar el ítem. También debo de agregar el tipo con el que va a trabajar la figura.

image

Ahora procedemos a trabajar en la consola. En primera instancia tenemos que crear la colección de productos que le vamos a enviar al workflow para que los procese.

image

Luego procedemos a crear la instancia del workflow y a pasarle los parámetros –> en este caso nuestra colección _productos. En la misma llamada se retorna la colección de productos ya procesados.

image

Seguidamente procedemos a convertir el parámetro de retorno en una lista y la procesamos.

image

El resultado al ejecutar el código anterior es el siguiente.

image

Etiquetas de Technorati: ,