• No se han encontrado resultados

Un ejemplo de LINQ para ir abriendo boca

In document c# linq (página 95-99)

A lo largo de este capítulo, iremos viendo las nuevas instrucciones que se han añadido a C# para dar soporte a todo lo relacionado con LINQ, pero para ir calentando motores, veamos un ejemplo para que sepamos lo que nos vamos a ir encontrando en el resto de éste y siguientes capítulos.

El código que veremos a continuación va a extraer de una colección de objetos de una clase llamada

Artículo todos los elementos cuyo código empiece por cero. Esa colección la podemos crear usando cualquiera de las dos formas que nos permite C# para inicializar arrays y colecciones. Si queremos tener la posibilidad de clasificar los elementos de la lista generada, usaremos una colección del tipo

List<T>, pero como veremos en un momento, con las nuevas instrucciones que LINQ nos ofrece, podremos generar los datos clasificados en el orden que deseemos. En este ejemplo, he optado por crear una colección del tipo List<Artículo> más que nada para que resulte más fácil agregar nuevos elementos a la colección, aunque la verdad es que si esos datos solo los vamos a utilizar en las con- sultas de LINQ, da igual que sea de un tipo o de otro, incluso podíamos crear un array, ya que la sintaxis de C# nos permite crear colecciones a partir de un array de una forma muy simple, particu- larmente apoyándonos en el método extensor ToList.

En el listado 6.1 vemos cómo generar esa colección usando la inicialización de objetos de cada uno de los artículos que queremos agregar a la lista.

var artículos = new List<Artículo>() { new Artículo("01")

{Descripción = "Refresco lima", PrecioVenta = 0.92M},

new Artículo("02")

{Descripción = "Refresco naranja", PrecioVenta = 0.9M},

new Artículo("00")

{Descripción = "Refresco cola", PrecioVenta = 0.95M},

new Artículo("11")

{Descripción = "Vino tinto brick", PrecioVenta = 0.55M},

new Artículo("21")

{Descripción = "Rioja 0.75 ml", PrecioVenta = 1.2M}

};

Listado 6.1. Una colección de elementos del tipo Artículo

La clase Artículo usada en estos ejemplos es la mostrada en el listado 6.2 en el que las propiedades de esa clase las he definido usando la auto implementación de propiedades, salvo en el caso de la propiedad IVA, ya que le he querido dar un valor predeterminado.

class Artículo

{

public string Código { get; set; } public string Descripción { get; set; } public decimal PrecioVenta { get; set; }

protected decimal m_IVA = 16M; public decimal IVA

{

get { return m_IVA; } set { m_IVA = value; } }

public Artículo() {

}

public Artículo(string código) {

this.Código = código; }

public override string ToString() {

return String.Format( "{0}, {1}, {2}",

Código, Descripción, PrecioVenta); }

}

Nota

La clase Artículo está simplificada para dar una idea de qué propiedades define. En el sitio Web del libro está el código completo junto a otras clases utilizadas a lo largo de esta parte del libro dedicada a LINQ.

Lo siguiente que vamos a hacer es extraer de la colección artículos los elementos cuya propiedad

Código empiece por cero. Esos datos los devolveremos ordenados de forma ascendente por el conte- nido de la propiedad PrecioVenta. Si la colección artículos fuese una tabla de una base de datos, el código de una consulta SQL que utilizaríamos sería similar al mostrado en el listado 6.3.

SELECT [Descripción],[PrecioVenta]

FROM [Articulos]

WHERE LEFT(Código, 1)='0' ORDER BY PrecioVenta ASC

Listado 6.3. Código SQL de una consulta

En el listado 6.4 vemos cómo extraer los datos usando las instrucciones de consulta integradas en el lenguaje (LINQ), que como podemos comprobar, es muy parecido al código del listado 6.3, solo que en esta ocasión utilizamos instrucciones de C#. En la comparación de la cláusula where he usado el método StartsWith de la clase string que es el que más se asemeja a la función LEFT del código de T-SQL.

var refrescos = from d in artículos

where d.Código.StartsWith("0") orderby d.PrecioVenta ascending

select new { d.Descripción, d.PrecioVenta };

Listado 6.4. Consulta de LINQ para extraer los datos de una colección

Como vemos en el listado 6.4, en las consultas de LINQ la instrucción select se indica al final, pero básicamente conseguimos lo mismo que con el código de SQL, que son todos los artículos cuyo código empiecen por cero, pero en lugar de obtener todos los campos de la “tabla” solo se devuelven los que hemos indicado después de select, en estos casos, un tipo anónimo con la descripción y el precio de venta.

Para mostrar los datos que contiene la variable refrescos lo podemos hacer como vemos en el listado 6.5. En ese código debemos fijarnos en dos cosas: una de ellas es que la variable r (cada uno de los elementos de la colección refrescos) tiene dos propiedades: Descripción y PrecioVenta, en realidad cada elemento de la colección es un tipo anónimo con esas dos propiedades; la segunda cosa que debe llamar nuestra atención es el uso de un método extensor (PadFillLeft) que yo he programado para la clase string (ver el listado 6.6), de forma que me devuelva la cantidad de caracteres indicados en el parámetro (en este ejemplo, 15), con idea de que se muestre el texto alineado, tal como vemos en el resultado mostrado en la figura 6.1. La razón de crear este método extensor y no usar uno de los existentes en la clase string, o usar las opciones de formato en el método WriteLine de la clase

Console, es porque si la cadena tiene más de 15 caracteres no se recortaría, como es en este caso, ya que todas las funciones de formato siempre devuelven como mínimo la cantidad que indiquemos, pero si el original tiene más caracteres (como en este caso en que el primer elemento mostrado tiene 16) se mostrarán todos los caracteres. Pero no mezclemos temas y sigamos con todas las novedades de C# relacionadas con LINQ.

foreach(var r in refrescos)

Console.WriteLine("{0} {1:0.00}",

r.Descripción.PadFillLeft(15), r.PrecioVenta);

Listado 6.5. Mostrar los datos del resultado de la consulta del listado 6.4

static class Extensiones

{

public static string PadFillLeft(this string str, int total) {

return (str + new string(' ', total)).Substring(0, total); }

}

Listado 6.6. El método PadFillLeft para ajustar el ancho de las cadenas al número de caracteres indicados

Figura 6.1. Resultado de la consulta LINQ

Si el lector no tiene muy claro qué es lo que hace todo el código que hemos visto, le pido que no se preocupe, que este ejemplo simplemente lo he usado para ir abriendo boca, como suelen decir en la tele, para que no haga zapping y cambie de canal. En un momento veremos todos los detalles de las nuevas instrucciones que C# incluye para dar soporte a LINQ. Pero antes veamos un poco de teoría sobre LINQ y las diferentes versiones que .NET Framework 3.5 pone a nuestra disposición.

In document c# linq (página 95-99)