03.02.10

101 Ejemplos de LINQ

Posted in .NET, Programación at 9:49 pm by Miguel

Abierto ayer el capítulo de LINQ, incorporo una interesante referencia extraida del MSN

101 Ejemplos de LINQ

Saludos.

Miguel

Rating 3.00 out of 5
[?]

03.01.10

El antes y el después de LINQ

Posted in .NET, Programación at 11:10 pm by Miguel

Problema: a partir de una lista de objetos de tipo “Coche”, quiero sumar el precio de cada uno de ellos agrupado por marca.

La clase coche tiene la siguiente forma

public class Coche
{
  public int IdCoche { get; set; }
  public string Matricula { get; set; }
  public int IdMarca { get; set; }
  public int NumeroPuertas { get; set; }
  public int Precio { get; set; }

  public Coche(int idCoche, string matricula, int idMarca, int numeroPuertas, int precio)
  {
     this.IdCoche = idCoche;
     this.Matricula = matricula;
     this.IdMarca = idMarca;
     this.NumeroPuertas = numeroPuertas;
     this.Precio = precio;
   }
}

Inicializamos una lista con objetos de la clase  Coche

List<Coche> lista = new List<Coche>();

lista.Add(new Coche(1, “3322-AAA”, 1, 3, 15000));
lista.Add(new Coche(2, “3322-EEE”, 2, 5, 25000));
lista.Add(new Coche(3, “3322-III”, 3, 3, 35000));
lista.Add(new Coche(4, “3322-OOO”, 1, 3, 18000));
lista.Add(new Coche(5, “3322-UUU”, 2, 5, 20000));
lista.Add(new Coche(6, “1111-AAA”, 3, 3, 150000));
lista.Add(new Coche(7, “1111-EEE”, 1, 3, 30000));
lista.Add(new Coche(8, “1111-III”, 1, 5, 28000));
lista.Add(new Coche(9, “1111-OOO”, 3, 5, 16000));
lista.Add(new Coche(10, “1111-UUU”, 1, 5, 9000));

Solución antes de LINQ (una de muchas)

Hashtable hash = new Hashtable();

foreach (Coche c in lista)
{
  if (!hash.ContainsKey(c.IdMarca))
  {
    hash.Add(c.IdMarca, c.Precio);
  }
  else
  {
    hash[c.IdMarca] = (int)hash[c.IdMarca] + c.Precio;
  }
}

IDictionaryEnumerator _enumerator = hash.GetEnumerator();

while (_enumerator.MoveNext())
{
  Console.WriteLine(String.Format(”Marca: {0}, Total Precio: {1}”, _enumerator.Key, _enumerator.Value));
}

Solución después de LINQ

var marcas = from m in lista
             group m by m.IdMarca into g
             select new { IdMarca = g.Key , TotalPorMarca = g.Sum (m => m.Precio) };

foreach (var marca in marcas)
{
  Console.WriteLine(String.Format(”Marca: {0}, Total Precio: {1}”, marca.IdMarca, marca.TotalPorMarca));
}

Resultado

Marca: 1, Total Precio: 100000
Marca: 2, Total Precio: 45000
Marca: 3, Total Precio: 201000

Saludos.

Rating 3.00 out of 5
[?]

02.16.10

Genéricos

Posted in Humor, Programación at 11:43 pm by Miguel

Uso de genéricos.

Ejemplo de Definición de Clase Genérica

public class Recurso<T>
{
T proyecto;
public void ResolverProyecto(T proyecto)
{
//TODO: Incluir código
}
}

Ejemplo de Instanciación

Recurso<granmarron> obj = new Recurso<granmarron>();

Conclusión

Al mal tiempo, buena cara.

Saludos.

Rating 3.00 out of 5
[?]

04.28.09

¿Cuál es el error?

Posted in Programación, Software at 8:04 am by Miguel

Por favor, echadle una ojeada a este pequeño artículo, me he quedado encantado:

http://desdesarrollodesoftware.blogspot.com/2009/02/cual-es-el-error.html

Un poco más ampliado el sentido del artículo anterior, lo podéis encontrar en el artículo siguiente:

http://desdesarrollodesoftware.blogspot.com/2009/02/la-respuesta-cual-es-el-error-la.html

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

04.22.09

Migrando de Escritorio a Web, el Problema de lo “static”

Posted in Programación, Web at 7:59 am by Miguel

Paso a describir uno de los típicos problemas que suele aparecer a las personas que desarrollan normalmente aplicaciones de escritorio y que entrar a participar en un proyecto en el que se requiere desarrollos web.

En escritorio, es algo muy común el utilizar propiedades estáticas (shared en VB.NET, static en C# y Java) para almacenar información que la aplicación necesita desde que arranca hasta que se cierra, o en algún formulario específico donde se esté trabajando de manera desconectada de la base de datos. Por ejemplo, la información del usuario activo, o el listado de facturas que se están presentando en un formulario en concreto. En este ámbito el uso de propiedades estáticas funciona a las mil maravillas ya que la aplicación se ejecuta en el contexto del usuario y hay un único usuario accediendo a la posición de memoria reservada por la propiedad estática.

El problema viene cuando intentamos hacer lo mismo en web, por ejemplo en la capa de presentación web, donde tenemos una página (aspx, php, jsp, jsf…) que muestra las facturas relacionadas a un determinado cliente, facturas que además, tras cada transacción que realizamos contra el formulario, van modificando su información. Si en este ámbito utilizamos una propiedad estática para almacenar las facturas, de igual manera que con la aplicación de escritorio, estamos compartiendo una única instancia de la lista, pero esta vez con una pequeña diferencia, aunque tengamos 1 o 100 usuarios accediendo al formulario, todos están trabajando contra la misma aplicación, por lo que todos están trabajando con la misma lista de facturas. La consecuencia de esto es obvia, ante las modificaciones que realicen cualquiera de los usuarios sobre la lista (al ser la misma para todos), afectará al trabajo del resto de usuarios.

¿Soluciones? Para la web existen otro tipo de soluciones dependiendo del tipo de información a almacenar y del rendimiento que queráis obtener: Sesión, Caché, Viewstate (para aplicaciones ASP.NET), campos Hidden (vale, vale, se está liando mucho la cosa, pero funcionar funciona, aunque le tengas que meter muchas horas), y, por supuesto, guardando en base de datos, que viene siento lo habitual y más recomendable en la mayoría de los casos.

Cualquier duda sobre algún problema en particular, dejad vuestro caso en los comentarios e intentaremos encontrar la solución más eficiente para vuestro contexto. Por favor, indicad problema y requerimientos de sistema.

Saludos!

Miguel.

Rating 3.00 out of 5
[?]

04.11.09

Explotando el método “Find” de listas genéricas. Predicados y Delegados.

Posted in .NET, Programación at 8:43 am by Miguel

Recientemente, en uno de los comentarios añadidos al post Mejorando Nuestros DAO y DTO, se ha tratado el uso del método Find en listas genéricas.

Dejo a vuestra disposición dos artículos que marcan sendos ejemplos de uso. Resulta una práctica que puede seros interesante en vuestros desarrollos.

Link 1

Link 2

Saludos y gracias a Ignacio por el apunte.

Miguel.

Rating 3.00 out of 5
[?]

03.30.09

AjaxControlToolkit y WebResource.axd

Posted in .NET, Herramientas, Programación, Web at 6:04 pm by Miguel

AjaxControlToolkit es el conjunto de controles web ajax provistos por el propio Microsoft y totalmente compatibles con Visual Studio 2008 y Framework 3.5 de .NET.

Hoy hablaremos brevemente cómo resolver la problemática que nos podemos encontrar si combinamos el uso de dicho Toolkit con la seguridad básica de ASP.NET.

Ante claúsulas como la descrita en la parte inferior:

<authorization>
<deny users=”*” />
</authorization>

estamos denegando el acceso a cualquiera de los recursos de la aplicación, a todos los usuarios que no cuenten con cierto tipo de autenticación. Cuando hablamos de recursos estamos hablando de recursos de cualquier tipo, entre los cuales estamos incorporando páginas aspx, javascript, imágenes, hojas de estilo, themes…

Para resolver el acceso total a recursos necesarios a nivel de aplicación como por ejemplo hojas de estilo, imágenes y javascript podemos combiar el anterior tag con el siguiente:

<location path=”images”>
<authorization>
<allow users =”*” />
</authorization>
</location>

donde podemos apreciar cómo para todos los usuarios estamos dando acceso a la carpeta donde estamos almacenando las imágenes. Si no hiciéramos esto, las páginas aspx se cargarían, pero no podríamos ver las imágenes que tuviéramos contenidas.

Algo muy similar pasa cuando utilizamos Ajax Control Toolkit, vamos a necesitar indicar la visibilidad de sus recursos a los usuarios para que puedan ejecutar los controles ajax, tanto la funcionalidad javascript que incorporan como sus imágenes y estilos relacionados. Para ello, no tenemos que dar permisos a una carpeta concreta, si no a un fichero que no es visible en tiempo de diseño, pero que sí podremos observar si lanzamos la aplicación. Se trata del archivo WebResource.axd.

Añadiendo el nuevo location

<location path=”WebResource.axd”>
<authorization>
<allow users =”*” />
</authorization>
</location>

conseguiremos nuestro objetivo. Nuestros controles ajax volverán a funcionar correctamente, veremos las imágenes relacionadas a los controles, así como sus estilos.

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

12.11.08

Where 1=1

Posted in Bases de Datos, Programación at 3:18 pm by Miguel

Un truco sencillo cuando estemos preparando consultas sql con condiciones dinámicas, en un buscador de elementos con varias condiciones de filtro por ejemplo, es utilizar en la base de la select la condición where 1=1.

Si tomamos como ejemplo la consulta

SELECT CAMPO1, CAMPO2, CAMPO3, CAMPO4
FROM TABLA1

Y quisiéramos añadir dinámicamente condiciones tendríamos que comprobar de base si ya tenemos una condición incluida para añadir el prefijo “AND”.

Incluyendo when 1=1 dejamos de lado este problema. Esta condición evalúa siempre cierto, y tiene un consumo impercetible en el cálculo, y ayuda a la hora de montar las condiciones de forma dinámica, ya que desde la primera concatenación de condiciones podemos partir de un “AND nuevacondicion”.

SELECT CAMPO1, CAMPO2, CAMPO3, CAMPO4
FROM TABLA1
WHERE 1=1 { AND… AND… AND… }

Es un truco un poco tonto, pero a la vez sencillo para dejar un código más limpio.

Saludos.

Rating 3.00 out of 5
[?]

10.26.08

Novedades Framework 3.5, Métodos de Extensión

Posted in .NET, Framework, Programación at 12:44 pm by Miguel

Es curioso el siguiente nuevo mecanismo que aparece en el .NET Framework 3.5,

namespace MetodosExtension
{
  public static class MisExtensiones
  {
    public static bool ContieneLaZ(this String str)
    {
      //Código que a partir de un string retorna verdadero
      //si éste contiene la letra ‘Z’
    }
  }
}

Que luego te deja hacer cosas como esta;

string variable = “escuché un zumbido”;
if (variable.ContieneLaZ())
{
}

A esta nueva facilidad que incluye el entorno de desarrollo se le llaman extensiones. Como podréis apreciar lo que se ha hecho es definir en una clase separada un nuevo método asociado a un objeto (String) que el propio framework de .NET trae consigo. La magia para conseguir esto último reside en la forma en la que se define el parámetro del método “ContieneLaZ”, que como véis utiliza el identificador “this” previo a la definición de la variable y el tipo.

La principal gracia de todo esto es la capacidad de poder dotar de más potencia a clases ya definidas sin necesidad de utilizar tipos derivados y sin modificar el tipo original.

Apuntar además que las extensiones se mantienen también cuando heredamos la clase original sobre la que se ha hecho la extensión. Por ejemplo, si extendemos la clase “Coche” con nuevas operaciones, y luego creamos una clase “CocheVolador”, esta última, también podrá contar con las extensiones definidas en su clase padre.

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

10.17.08

Solid RAD

Posted in .NET, Arquitectura, Herramientas, Programación, Software, WCF at 8:22 pm by Miguel

Recientemente he tenido la oportunidad de participar en una presentación de Solid RAD, la herramienta para el desarrollo rápido de aplicaciones, ofrecida bajo el sello y garantía de calidad del equipo de Solid Quality Mentors

Jesús López y Daniel Seara (con el cual he tenido nuevamente el placer de coincidir) han sido los dos mentores de Solid que realizaron la presentación de forma conjunta.

A partir de la propia arquitectura y orientación de Solid RAD, la cual podréis conocer consultando el video provisto en el siguiente enlace mms://solidq.com/SolidRad (copiar el link y ejecutar pegando en la barra de dirección de Internet Explorer), destacar la inmensa oportunidad que supone compartir durante parte de una mañana, y de forma directa y personalizada, de los conocimientos y opiniones de los dos mentores. Lo que ha dado una pequeña “discusión” sobre el uso de las transacciones es algo que me gustaría exponer en un próximo artículo. A mi la visión me ha parecido genial.

Destacar entre otras cosas de Solid RAD, otras ideas fantásticas, como las de partir de un modelo de objetos de negocio para exponer el conocimiento a otras capas, pero sin orientar el modelo de objetos directamente a las entidades de datos, tal como haría un ORM, si no a las vistas definidas sobre dichas entidades de datos. Es una idea simplemente genial combiándola al mismo tiempo con el generador de código de Solid RAD, que automatiza la generación de las entidades de transporte de datos a partir de las propiedades de cada una de las vistas sobre la que es accedida.

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

« Previous entries Next Page » Next Page »