Programación de Objetos.Net C# LDP3501-2011 / DUOC-AV



Documentos relacionados
Correspondencias entre taxonomías XBRL y ontologías en OWL Unai Aguilera, Joseba Abaitua Universidad de Deusto, EmergiaTech

CONSULTAS MULTITABLAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Modulo 1 El lenguaje Java

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

Modelos y Bases de Datos

Programación de Objetos.Net C# LDP / DUOC-AV

ADO.NET. Arquitectura de ADO.NET

Introducción a Visual Studio.Net

Base de datos en la Enseñanza. Open Office

CONSULTAS DE RESUMEN SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Tecnología de la Información y la Comunicación. Base de datos. Consultas

Base de datos relacional

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Base de datos en Excel

Introducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual

El proceso de edición digital en Artelope y CTCE

La ventana de Microsoft Excel

OBTENER DATOS EXTERNOS

Figura 4.1 Clasificación de los lenguajes de bases de datos

PROGRAMACIÓN ORIENTADA A OBJETOS

Introducción a las tablas dinámicas

5- Uso de sentencias avanzadas

MATERIAL 2 EXCEL 2007

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

Operaciones en el Modelo Relacional. Relacional. Relacional. Índice. Lenguajes de Consulta

Actualización de versión a Bizagi 10.x

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Hoja1!C4. Hoja1!$C$4. Fila

Los números racionales

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

Versión: 01. Fecha: 01/04/2013. Código: F004-P006-GFPI GUÍA DE APRENDIZAJE Nº 1 1. IDENTIFICACIÓN DE LA GUIA DE APRENDIZAJE

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

Construcción de Escenarios

BASE DE DATOS RELACIONALES

Programa para el Mejoramiento de la Enseñanza de la Matemática en ANEP Proyecto: Análisis, Reflexión y Producción. Fracciones

Centro de Capacitación en Informática

VAST: Manual de usuario. Autores: Francisco J. Almeida-Martínez Jaime Urquiza-Fuentes

TEMA 6. ARQUITECTURA DE ADO.NET 6.1. INTRODUCCIÓN A ADO.NET

PRÁCTICAS DE GESTIÓN GANADERA:

Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL

select nombre from profesores where categoria='aso6';

HERRAMIENTAS DE ACCESS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Tutorial de UML. Introducción: Objetivos: Audiencia: Contenidos:

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

A25. Informática aplicada a la gestión Curso 2005/2006 Excel Tema 7. Funciones avanzadas de Excel II

InfoPath forma parte del paquete ofimático de Microsoft desde la versión XP (2003).

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

LABORATORIO Nº 3 PRÁCTICA DE FUNCIONES EN MICROSOFT EXCEL

QUÉ ES UNA BASE DE DATOS Y CUÁLES SON LOS PRINCIPALES TIPOS? EJEMPLOS: MYSQL, SQLSERVER, ORACLE, POSTGRESQL, INFORMIX (DV00204A)

Centro de Capacitación en Informática

Inside. Gestión de Expedientes y Documentos Electrónicos

LAS SUBCONSULTAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

SQL (Structured Query Language)

INVENTARIO INTRODUCCIÓN RESUMEN DE PASOS

Sesión No. 2. Contextualización: Nombre de la sesión: Paquetería ASPEL - COI PAQUETERÍA CONTABLE

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

Sistema de Mensajería Empresarial para generación Masiva de DTE

Guía LEGAL Conectores sociales Y "SOCIAL LOGIN"

ESPOCH ESCUELA DE MEDICINA HERNANDEZ MAYRA FORMULAS Y DUNCIONES BASICAS ESPOCH

MICROSOFT ACCESS 2003

BASES DE DATOS TEMA 3 MODELO ENTIDAD - RELACIÓN

Curso Excel Básico - Intermedio

INSTRUCTIVO DEL COMANDO MAKE

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:

Microsoft Access 2007 (Completo)

Estructuras de Datos y Algoritmos. Árboles de Expresión

Módulo II - PowerPoint

Base de Datos de Compras. Creación del Informe.

EDICIÓN Y FORMATO (II)

Ficheros Electrónicos

5.8. REGISTRO DE FACTURAS.

CONSULTAS CON SQL. 3. Hacer clic sobre el botón Nuevo de la ventana de la base de datos. Aparecerá el siguiente cuadro de diálogo.

GUÍA TÉCNICA PARA LA DEFINICIÓN DE COMPROMISOS DE CALIDAD Y SUS INDICADORES

UNIDAD 6. POLINOMIOS CON COEFICIENTES ENTEROS

Instalación del programa PSPP y obtención de una distribución de frecuencias.

Capítulo 11. Conclusiones y trabajo futuro

Combinar comentarios y cambios de varios documentos en un documento

Notación UML para modelado Orientado a Objetos

MICROSOFT ACCESS 2010

Manual de OpenOffice Impress

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Cálculo Simbólico también es posible con GeoGebra

Sistemas de Calidad Empresarial

Consultas con combinaciones

Eduardo Kido 26-Mayo-2004 ANÁLISIS DE DATOS

TEMA 20: CONCEPTOS BÁSICOS DE SQL

L U I S P A T I Ñ O IN FOR M Á T I C A SIS T E M A S AVA N Z A DOS

La perspectiva de género en la sistematización de experiencias

Servicios de Formación:

Figura 1 Abrir nueva hoja de cálculo

Funciones CONJUNTO EXCEL 2013 AVANZADO

MANUAL PARA CREAR USUARIOS. Guía para crear, desactivar e inmovilizar Usuarios de Salesforce

Operación Microsoft Access 97

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

Operación de Microsoft Word

SISTEMAS OPERATIVOS AVANZADOS

TEMA 3 PROFESOR: M.C. ALEJANDRO GUTIÉRREZ DÍAZ 2 3. PROCESAMIENTO DE CONSULTAS DISTRIBUIDAS

Capitulo VII. Editor de Mapa de Tareas. Como hemos hablado en los capítulos anteriores, sabemos que parte del éxito

NOVEDADES Y MEJORAS. datahotel versión 9.00 TRABAJAR CON I.V.A INCLUIDO

COLEGIO APUNTES ACCESS

Transcripción:

En esta guía: Programación de Objetos.Net C# LDP3501-2011 / DUOC-AV Colecciones de Negocio... 1 Creación de una colección personalizada... 2 Introducción a LINQ (Language Integrated Query)... 4 Las tres partes de una operación de consulta... 4 El Origen de Datos...5 La Consulta...6 Ejecución de la Consulta...7 Sintaxis de Consulta y Sintaxis de Métodos en LINQ... 9 Expresiones lambda... 10 LINQ to Objects... 11

Colecciones de Negocio Hemos revisado el manejo de variables tratadas de manera grupal por medio de las clases de colección, con las distintas especializaciones y posibilidades que nos brindan. Uno de los elementos necesarios de tratar en este aspecto dice relación con la manipulación grupal de nuestras propias clases de negocio. En esta guía nos introduciremos en el concepto de objetos plurales, es decir, el manejo de las clases de negocio como un conjunto de ellas y desde luego, nos apoyaremos en las clases que nos brindan facilidades en el manejo grupal como lo son las colecciones. Si bien las clases de colección vistas (ArrayList, List<T> y Hashtable), permiten solucionar la mayoría de los problemas con agrupaciones, es necesario realizar ciertas implementaciones particulares para satisfacer una función particular que se nos requiera. Por ejemplo si estamos tratando el caso de una factura, esta estará compuesta por los datos propios de la factura (número, fecha de emisión, etc.) y por un conjunto de líneas de detalle (número, producto, cantidad, etc.), como se muestra en la siguiente figura: Factura «uses» LineaDetalle La Factura requerirá entonces realizar algunos cálculos para poder obtener la información que necesita de las líneas de detalle, como lo son: agregar nuevas líneas, modificar o eliminar líneas existentes, suma de los montos individuales para el monto de la factura entre otros. Como estas funcionalidades son parte del conjunto del conjunto de líneas de detalle, no sería la mejor solución programarlas en la factura, por lo tanto debemos dotar de ellas a una clase especializada que las maneje y se especialice en ellas. Entonces para agrupar estas funciones en una clase construimos una que coleccione y manipule las líneas de detalle, como se muestra en la siguiente figura: Factura LineaDetalleCollection «uses» LineaDetalle Con este esquema podemos centralizar en la colección los cálculos y funciones que son requeridas al tratar las líneas como un conjunto, desligando de estas responsabilidades a la factura, que en este caso solo hará uso de las funciones expuestas por la colección. En este punto podemos optimizar la programación de la colección reutilizando las funciones de las clases de colección del.net Framework, de tal forma que la mantención del conjunto se base en las prestaciones de la clase colección base y nos focalizamos en los problemas propios de nuestra clase de negocio como se muestra en la siguiente figura: Página 1

List<T> Factura LineaDetalleCollection «uses» LineaDetalle Creación de una colección personalizada En la actividad de Manejo de Hashtable, solucionamos el tratamiento de objetos complejos (clases propias), permitiendo el acceso a ellas por medio de una llave. Esto nos soluciona el acceso a un elemento específico, siempre y cuando conozcamos la llave, pero no nos permite obtener un subconjunto en base a algún criterio definido, como por ejemplo: obtener un subconjunto de personas cuyo nombre sea Juan. Como la solución vista se basa en el acceso por la llave, nos vemos en la necesidad de implementar una búsqueda en la colección. Adicionalmente si se requiere de cálculos sobre el conjunto de objetos, también deberos realizar la implementación necesaria. Para resolver las posibles funcionalidades grupales sobre nuestra clase, haremos uso de la herencia con la finalidad de reutilizar las facilidades de las clases de colección, los beneficios y objetivos perseguidos son: Reutilización: Al crear nuestra nueva colección en base a alguna de las colecciones bases, podemos hacer uso de los métodos que ellas ya poseen como lo son: Definir el repositorio contenedor, agregar elementos, eliminar elementos y capacidad de recorrido mediante enumeraciones, entre otras. Extensión: Podemos agregar nuevos métodos útiles para nuestra solución particular o modificar los existentes, si es necesario. Especialización: Agregar funcionalidad específica para resolver problemas sobre el tratamiento grupal de nuestra clase. Encapsulación: Por medio de la formalización de una clase, tendremos toda la funcionalidad requerida para ser utilizada en diversos puntos de la solución. Esto evita el tener que escribir código para el manejo de la colección en capas superiores o en concreto en la página ASP.Net u otro contenedor de presentación. La definición de nuestra colección de negocio pasaría entonces por la declaración de la clase con herencia. Para el ejemplo se utiliza la clase List<T>, ya que con ello aseguramos la colección de un tipo definido de objeto, la siguiente línea de código asume la existencia de la clase LineaDetalle y hace la declaración de nuestra nueva clase LineaDetalleCollection heredando de List<T>, asegurando el manejo del tipo de datos LineaDetalle en su declaración: Página 2

public class LineaDetalleCollection: List<LineaDetalle> { } En base a esta declaración ya podemos hacer uso de los métodos provistos por la colección base, como se muestra en el siguiente ejemplo: LineaDetalleCollection Lineas = new LineaDetalleCollection(); LineaDetalle linea = new LineaDetalle(); Lineas.Add(linea); Console.WriteLine( Lineas.Count); Lineas.Clear(); Para ejemplificar la creación de una colección de negocio, haremos uso de la clase creada en la guía anterior, y realizaremos el desarrollo en la siguiente actividad. Página 3

Introducción a LINQ (Language Integrated Query) En la actividad anterior hemos implementado algunas funciones de búsqueda en la clase de colección, para ello realizamos el recorrido por los elementos contenidos e hicimos la consulta particular de lo que requeríamos. Con la versión 3.5 del.net Framework, se ha incorporado un lenguaje de consulta que nos facilita la obtención de resultados en base a consultas estructuradas sobre colecciones en memoria, bases de datos relacionales y datos en formato Xml. Tradicionalmente, las consultas con datos se expresan como cadenas sencillas, sin comprobación de tipos en tiempo de compilación ni compatibilidad con IntelliSense. Además, es necesario aprender un lenguaje de consultas diferente para cada tipo de origen de datos: bases de datos SQL, documentos XML, servicios web diversos, etc. LINQ convierte una consulta en una construcción de lenguaje de primera clase. Las consultas se escriben para colecciones de objetos con establecimiento inflexible de tipos (seguridad de tipos), utilizando palabras clave del lenguaje y operadores con los que se está familiarizado. Una consulta es una expresión que recupera datos de un origen de datos. Las consultas normalmente se expresan en un lenguaje de consultas especializado. A lo largo del tiempo se han ido desarrollando lenguajes diferentes para los distintos tipos de orígenes de datos, como SQL para las bases de datos relacionales y XQuery para XML. Por consiguiente, los programadores han tenido que aprender un nuevo lenguaje de consultas para cada tipo de formato u origen de datos que deben admitir. LINQ simplifica esta situación, proporcionando un modelo coherente para trabajar con datos de distintos tipos de formatos y orígenes de datos. En una consulta LINQ, siempre se trabaja con objetos. Se utilizan los mismos modelos de codificación básicos para consultar y transformar datos de documentos XML, bases de datos SQL, conjuntos de datos ADO.NET, colecciones.net y cualquier otro formato para el que haya disponible un proveedor LINQ. Las tres partes de una operación de consulta Todas las operaciones de consulta LINQ se componen de tres acciones distintas: 1. Obtención del origen de datos. 2. Creación de la consulta. 3. Ejecución de la consulta. En la siguiente ilustración se muestra la operación de consulta completa. En LINQ, la ejecución de la consulta es distinta de la propia consulta; en otras palabras, no se recuperan datos con la simple creación de la variable de consulta. Página 4

En el ejemplo se muestra cómo se expresan las tres partes de una operación de consulta en el código fuente. En el ejemplo se utiliza por comodidad una matriz de enteros como origen de datos, pero los mismos conceptos se aplican a otros orígenes de datos. /* Las 3 partes de una consulta LINQ */ // 1. Origen de Datos. int[] numeros = new int[5] { 1, 2, 3, 4, 5, }; // 2. Consulta. // consultanumeros será una instancia de IEnumerable<int> var consultanumeros = from num in numeros where (num % 2) == 0 select num; // 3. Ejecución de la consulta. foreach (int numero in consultanumeros) { Console.Write(numero); } El Origen de Datos En el ejemplo anterior, como el origen de datos es una matriz, se admite implícitamente la interfaz genérica IEnumerable<T>. Este hecho implica que se puede consultar con LINQ. Una consulta se ejecuta en una instrucción foreach y foreach requiere IEnumerable o IEnumerable<T>. Los tipos que admiten IEnumerable<T> o una interfaz derivada, como la genérica IQueryable<T>, se conocen como tipos consultables. Página 5

Un tipo que se puede consultar no requiere ninguna modificación o tratamiento especial para servir como origen de datos LINQ. Si los datos de origen aún no están en memoria como tipo que se puede consultar, el proveedor LINQ debe representarlos como tales. Por ejemplo, LINQ to XML carga un documento XML en un tipo XElement que se puede consultar: // Creación de una fuente de datos desde un document Xml using System.Xml.Linq; XElement contacts = XElement.Load(@"c:\Contactos.xml"); Con LINQ to SQL, primero se crea una asignación relacional de objetos en tiempo de diseño, ya sea manualmente o mediante el Diseñador relacional de objetos (Diseñador R/O). Después, se escriben las consultas en los objetos y, en tiempo de ejecución, LINQ to SQL controla la comunicación con la base de datos. En el ejemplo siguiente, Customer representa una tabla concreta de la base de datos y Table<Customer> admite la interfaz genérica IQueryable<T>, que se deriva de IEnumerable<T>. // Creación de una fuente de datos desde una base de datos SQL Server. using System.Data.Linq; DataContext db = new DataContext(@"c:\northwind\northwnd.mdf"); En resumen, un origen de datos LINQ es cualquier objeto que admite la interfaz genérica IEnumerable<T> o una interfaz que herede de ella. La Consulta La consulta especifica qué información se va a recuperar de uno o varios orígenes de datos. Opcionalmente, una consulta también especifica cómo debería ordenarse, agruparse y darse forma a esa información antes de ser devuelta. Una consulta se almacena en una variable de consulta y se inicializa con una expresión de consulta. Para simplificar la escritura de consultas, C# incluye nueva sintaxis de consulta. La consulta del ejemplo anterior devuelve todos los números pares de la matriz de enteros. La expresión de consulta contiene tres cláusulas: from, where y select. La cláusula from especifica el origen de datos, la cláusula where aplica el filtro y la cláusula select especifica el tipo de los elementos devueltos. Aquí, lo importante es que, en LINQ, la propia variable de consulta no realiza ninguna acción ni devuelve datos, simplemente almacena la información necesaria para generar los resultados cuando la consulta se ejecute posteriormente. Las expresiones de consulta tienen las siguientes características: Se pueden utilizar para consultar y transformar los datos de cualquier origen de datos compatible con LINQ. Página 6

Son fáciles de controlar porque utilizan muchas construcciones de lenguaje de C# familiares. Todas las variables de una expresión de consulta tienen establecimiento inflexible de tipos, aunque en muchos casos no es necesario proporcionar el tipo explícitamente porque el compilador puede deducirlo. Una consulta no se ejecuta hasta que se recorre en iteración la variable de consulta en una instrucción foreach. En tiempo de compilación, las expresiones de consulta se convierten en llamadas a métodos de operador de consulta estándar de acuerdo con las reglas establecidas en la especificación de C#. Cualquier consulta que se puede expresar con sintaxis de consulta también se puede expresar con sintaxis de método. Sin embargo, en la mayoría de los casos, la sintaxis de consulta es más legible y concisa. Como norma, cuando escriba consultas LINQ, se recomienda que siempre que sea posible se utilice la sintaxis de consulta y que utilice la sintaxis de método sólo cuando sea necesario. No existe ninguna diferencia semántica o de rendimiento entre las dos formas. Las expresiones de consulta suelen ser más legibles que las expresiones equivalentes escritas con sintaxis de método. Algunas operaciones de consulta, como Count o Max, no tienen ninguna cláusula de expresión de consulta equivalente y, por tanto, deben expresarse como una llamada a método. La sintaxis de método se puede combinar con la sintaxis de consulta de varias maneras. Las expresiones de consulta pueden compilarse en árboles de expresión o en delegados, dependiendo del tipo al que se aplique la consulta. Las consultas IEnumerable(Of T) se compilan en delegados. Las consultas IQueryable y IQueryable(Of T) se compilan en árboles de expresión. Ejecución de la Consulta Al definir la consulta, esta no es ejecutada hasta el momento de ser requerido el conjunto resultante de su ejecución. La ejecución puede ser pospuesta de manera diferida o forzar su realización. Ejecución Diferida Como se ha mencionado previamente, la variable de consulta sólo almacena los comandos de la consulta. La ejecución real de la consulta se aplaza hasta que se procese una iteración en la variable de consulta, en una instrucción foreach. Este concepto se conoce como ejecución diferida y se muestra en el ejemplo siguiente: Página 7

foreach (int numero in consultanumeros) { Console.Write(numero); } La instrucción foreach es también donde se recuperan los resultados de la consulta. Por ejemplo, en la consulta anterior, la variable de iteración num contiene cada valor (de uno en uno) en la secuencia devuelta. Dado que la propia variable de consulta nunca contiene los resultados de la consulta, se puede ejecutar tantas veces como se desee. Por ejemplo, puede que una aplicación independiente actualice continuamente una base de datos. En su aplicación, podría crear una consulta que recuperase los datos más recientes, y podría ejecutarla repetidamente cada cierto tiempo para recuperar cada vez resultados diferentes. Forzar ejecución inmediata Las consultas que realizan funciones de agregación en un intervalo de elementos de origen, primero deben recorrer en iteración dichos elementos. Algunos ejemplos de esas consultas son Count, Max, Average y First. Se ejecutan sin una instrucción foreach explícita porque la propia consulta debe utilizar foreach para devolver un resultado. Debe saber también que estos tipos de consultas devuelven un solo valor, no una colección IEnumerable. La consulta siguiente devuelve un recuento de los números pares de la matriz de origen: /* Consulta para obtener los números pares del arreglo */ var consultanumeros = from num in numeros where (num % 2) == 0 select num; /* Obtiene el total de números pares en base a la consulta */ int total = consultanumeros.count(); Para forzar la ejecución inmediata de cualquier consulta y almacenar en memoria caché sus resultados, puede llamar al método ToList<TSource> o ToArray<TSource>. /* Recuperación en una lista */ List<int> consultalista = (from num in numeros where (num % 2) == 0 select num).tolist(); /* Recuperación en un arreglo */ var consultaarreglo = (from num in numeros Página 8

where (num % 2) == 0 select num).toarray(); También puede forzar la ejecución si coloca el bucle foreach justo después de la expresión de consulta. Sin embargo, al llamar a ToList o ToArray también se almacenan en memoria caché todos los datos en un objeto de colección único. Sintaxis de Consulta y Sintaxis de Métodos en LINQ La mayoría de las consultas de la documentación de introducción a LINQ están escritas como expresiones de consulta, utilizando la sintaxis de consulta declarativa que se dio a conocer en C# 3.0. Sin embargo,.net Common Language Runtime (CLR) no reconoce por sí mismo la sintaxis de consulta. Por consiguiente, en tiempo de compilación, las expresiones de consulta se convierten en elementos que CLR reconoce, esto es, llamadas a método. Estos métodos se conocen como operadores de consulta estándar y tienen nombres como Where, Select, GroupBy, Join, Max, Average, etc. Se pueden llamar directamente utilizando sintaxis de método en lugar de sintaxis de consulta. Por lo general, recomendamos la sintaxis de consulta porque normalmente es más fácil y legible; sin embargo, no hay ninguna diferencia semántica entre la sintaxis de método y la sintaxis de consulta. Además, algunas consultas, como las que recuperan el número de elementos que coinciden con una condición especificada o las que recuperan el elemento que tiene el valor máximo de una secuencia de origen, sólo se pueden expresar como llamadas a método. En la documentación de referencia de los operadores de consulta estándar en el espacio de nombres System.Linq generalmente se utiliza la sintaxis de método. Por consiguiente, aunque esté empezando a escribir consultas LINQ, le resultará útil estar familiarizado con el uso de la sintaxis de método en consultas y en expresiones de consulta. En el ejemplo siguiente se muestra una expresión de consulta simple y la consulta semánticamente equivalente, escrita como consulta basada en método: int[] numeros = { 1, 2, 3, 4, 5 }; //Sintaxis de Consulta: IEnumerable<int> numquery1 = from num in numeros where num % 2 == 0 orderby num select num; //Sintaxis de Método: IEnumerable<int> numquery2 = numeros.where(num => num % 2 == 0).OrderBy(n => n); El resultado de los dos ejemplos es idéntico. Puede ver que el tipo de la variable de consulta es el mismo en ambos formatos: IEnumerable<T>. Página 9

Para entender la consulta basada en método, examinémosla más de cerca. En el lado derecho de la expresión, observe que la cláusula where se expresa ahora como un método de instancia en el objeto numbers, que, como recordará, es de tipo IEnumerable<int>. Si está familiarizado con la interfaz genérica IEnumerable<T>, sabrá que no tiene un método Where. Sin embargo, si invoca la lista de finalización de IntelliSense en el IDE de Visual Studio, verá no sólo un método Where, sino muchos otros métodos, como Select, SelectMany, Join y Orderby. Éstos son todos los operadores de consulta estándar. Aunque parece que IEnumerable<T> se ha redefinido para incluir estos métodos adicionales, no es así. Los operadores de consulta estándar se implementan como un nuevo tipo de método denominado método de extensión. Los métodos de extensión "extienden" un tipo existente; se pueden llamar como si fueran métodos de instancia en el tipo. Los operadores de consulta estándar extienden IEnumerable<T> y por eso puede escribir numbers.where(...). Para empezar a utilizar LINQ, todo lo que realmente tiene que saber sobre los métodos de extensión es cómo incluirlos en el ámbito en su aplicación utilizando las directivas using correctas. Algunos proveedores LINQ, como LINQ to SQL y LINQ to XML, implementan sus propios operadores de consulta estándar y métodos de extensión adicionales para otros tipos además de IEnumerable<T>. Expresiones lambda En el ejemplo anterior, observe cómo la expresión condicional (num % 2 == 0) se pasa como argumento en línea al método Where: Where(num => num % 2 == 0). Esta expresión insertada se denomina expresión lambda. Es una manera sencilla de escribir código que de lo contrario sería más complejo y debería escribirse como método anónimo, delegado genérico o árbol de expresión. En C#, => es el operador lambda, que se lee como "va a". El elemento num que está a la izquierda del operador es la variable de entrada que corresponde a num en la expresión de consulta. El compilador puede deducir el tipo de num porque sabe que numeros es un tipo IEnumerable<T> genérico. El cuerpo de una expresión lambda es exactamente igual que el de una expresión en sintaxis de consulta o cualquier otra expresión o instrucción de C#; puede incluir llamadas a método y otra lógica compleja. El "valor devuelto" es tan solo el resultado de la expresión. Página 10

LINQ to Objects El término "LINQ to Objects" hace referencia al uso de consultas LINQ con cualquier colección IEnumerable o IEnumerable<T> directamente, sin utilizar ninguna API o proveedor LINQ intermedio, como LINQ to SQL o LINQ to XML. Puede utilizar LINQ para consultar cualquier colección enumerable, como List<T>, Array o Dictionary<TKey, TValue>. La colección puede estar definida por el usuario o ser devuelta por una API de.net Framework. Básicamente, LINQ to Objects representa una nueva forma de ver las colecciones. De la manera convencional, es necesario escribir bucles foreach complejos que especifican cómo recuperar los datos de una colección. Según LINQ, se escribe código declarativo que describe lo que se desea recuperar. Además, las consultas LINQ ofrecen tres ventajas principales respecto a los bucles foreach tradicionales: Son más concisas y legibles, sobre todo al filtrar varias condiciones. Proporcionan funcionalidad eficaz de filtrado, ordenación y agrupación con código de aplicación mínimo. Se pueden trasladar a otros orígenes de datos con pocas o ningunas modificaciones. En general, cuanto más compleja sea la operación que se deba realizar con los datos, observará un número mayor de ventajas al utilizar LINQ en lugar de las técnicas de iteración convencionales. Página 11