Que es LinQ
LINQ en C# se usa para trabajar con acceso a datos de orígenes como objetos, conjuntos de datos, SQL Server y XML. LINQ son las siglas de Language Integrated Query. LINQ es una API de consulta de datos con sintaxis de consulta similares a SQL. LINQ proporciona funciones para consultar datos almacenados en caché de todo tipo de orígenes de datos. La fuente de datos podría ser una colección de objetos, una base de datos o archivos XML. Podemos recuperar fácilmente datos de cualquier objeto que implemente la interfaz IEnumerable<T>.
El objetivo oficial de la familia
de tecnologías LINQ es agregar "funciones de consulta de propósito general
a .NET Framework que se aplican a todas las fuentes de información, no solo a
datos relacionales o XML".
Ventajas de LINQ
1. LINQ
ofrece una forma basada en objetos e integrada en el lenguaje para consultar
datos sin importar de dónde provengan. Entonces, a través de LINQ, podemos
consultar la base de datos, XML y las colecciones.
2. Comprobación
de sintaxis en tiempo de compilación
3. Le
permite consultar colecciones como matrices, clases enumerables, etc. en el
idioma nativo de su aplicación, como VB o C#, de la misma manera que
consultaría una base de datos usando SQL.
LINQ para objeto
LINQ to Object proporciona funcionalidad para consultar colecciones y objetos en memoria. Cualquier clase que implemente la interfaz IEnumerable<T> (en el espacio de nombres System.Collections.Generic) se puede consultar con SQO.
LINQ a ADO.NET
LINQ to ADO.NET trata con datos
de fuentes externas, básicamente cualquier cosa a la que ADO.NET se pueda
conectar. Cualquier clase que implemente IEnumerable<T> o
IQueryable<T> (en el espacio de nombres System.Query) se puede consultar
con SQO.
·
LINQ to SQL (DLinq) {Consultas realizadas en la
base de datos de relaciones solo compatibles con Microsoft SQL Server}
·
LINQ to DataSet {Admite consultas mediante el
uso de conjuntos de datos y tablas de datos de ADO.NET}
·
LINQ a entidades
LINQ a XML (XLinq)
LINQ to XML se utiliza para
consultar orígenes de datos XML.
DEMOSTRACIÓN
A continuación construiremos un pequeño conjunto de ejemplos que nos
servirán como punto de inicio para comprender el funcionamiento de la sintaxis
de este lenguaje. Comenzaremos creando en primer lugar un pequeño conjunto de
datos sobre los que operar. Crearemos para ello cuatro entidades relacionadas
entre sí. Asumiremos que tratamos de crear una aplicación para una papelería
que quiere llevar un registro de clientes y ventas de productos, por lo que
haremos uso de las siguientes entidades:
·
Cliente: simboliza un cliente de la papelería.
·
Id (int)
·
Nombre
(string)
·
FechaNac
(DateTime)
·
Producto: simboliza cada uno de los materiales que la
papelería venderá a los clientes.
·
Id (int)
·
Descripcion
(string)
·
Precio
(float)
·
Pedido: simboliza un conjunto de productos proporcionados
a un cliente concreto, por lo que se compondrá de una o más líneas de pedido.
·
Id (int)
·
IdCliente
(int)
·
FechaPedido
(DateTime)
·
LineaPedido: simboliza la venta de un número de un único
producto concreto a un cliente en particular. Se asocia a un único pedido.
·
Id (int)
·
IdPedido
(int)
·
IdProducto
(int)
·
Cantidad
(int)
Hemos definido las relaciones pese a que para este ejemplo no vamos a
hacer uso de una base de datos relacional. Sin embargo, nuestro objetivo es
simular esta opción (veremos cómo acceder a una fuente de datos relacional en
posteriores artículos), por lo que haremos algo que nunca, bajo ninguna
circunstancia, debería hacerse: codificar los datos en una clase de forma
manual. Todo sea por el afán didáctico
Como hemos dicho, crearemos una clase estática que contenga una lista de
cada una de estas clases. El código de éstas será el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Cliente { public int Id { get; set; } public string Nombre { get; set; } public DateTime FechaNac { get; set; } } public class Producto { public int Id { get; set; } public string Descripcion { get; set; } public float Precio { get; set; } } public class Pedido { public int Id { get; set; } public int IdCliente { get; set; } public DateTime FechaPedido { get; set; } } public class LineaPedido { public int Id { get; set; } public int IdPedido { get; set; } public int IdProducto { get; set; } public int Cantidad { get; set; } } |
Ahora que hemos modelado las entidades, crearemos una clase estática que
contenga, también de forma estática, un listado de los objetos que acabamos de
decir (niños, no hagáis esto en producción).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
public static class DataLists { private static List<Cliente> _listaClientes = new List<Cliente>()
{ new Cliente { Id = 1,
Nombre = "Carlos Gonzalez Rodriguez", FechaNac = new DateTime(1980, 10, 10) }, new Cliente { Id = 2,
Nombre = "Luis Gomez Fernandez",
FechaNac = new DateTime(1961, 4, 20) }, new Cliente { Id = 3,
Nombre = "Ana Lopez Diaz
",
FechaNac = new DateTime(1947, 1, 15) }, new Cliente { Id = 4,
Nombre = "Fernando Martinez Perez", FechaNac
= new DateTime(1981, 8, 5) }, new Cliente { Id = 5,
Nombre = "Lucia Garcia
Sanchez", FechaNac = new DateTime(1973, 11, 3) } }; private static List<Producto> _listaProductos = new List<Producto>() { new Producto { Id =
1, Descripcion =
"Boligrafo",
Precio = 0.35f }, new Producto { Id =
2, Descripcion = "Cuaderno
grande", Precio = 1.5f }, new Producto { Id =
3, Descripcion = "Cuaderno pequeño",
Precio = 1 }, new Producto { Id =
4, Descripcion = "Folios 500
uds.", Precio = 3.55f }, new Producto { Id =
5, Descripcion =
"Grapadora",
Precio = 5.25f }, new Producto { Id =
6, Descripcion =
"Tijeras",
Precio = 2 }, new Producto { Id =
7, Descripcion = "Cinta
adhesiva", Precio = 1.10f }, new Producto { Id =
8, Descripcion =
"Rotulador",
Precio = 0.75f }, new Producto { Id =
9, Descripcion = "Mochila
escolar", Precio = 12.90f }, new Producto { Id =
10, Descripcion = "Pegamento
barra", Precio = 1.15f }, new Producto { Id =
11, Descripcion =
"Lapicero",
Precio = 0.55f }, new Producto { Id =
12, Descripcion =
"Grapas",
Precio = 0.90f } }; private static List<Pedido> _listaPedidos =
new List<Pedido>() { new Pedido { Id =
1, IdCliente = 1, FechaPedido = new DateTime(2013, 10, 1) }, new Pedido { Id =
2, IdCliente = 1, FechaPedido = new DateTime(2013, 10, 8) }, new Pedido { Id =
3, IdCliente = 1, FechaPedido = new DateTime(2013, 10, 12) }, new Pedido { Id =
4, IdCliente = 1, FechaPedido = new DateTime(2013, 11, 5) }, new Pedido { Id =
5, IdCliente = 2, FechaPedido = new DateTime(2013, 10, 4) }, new Pedido { Id =
6, IdCliente = 3, FechaPedido = new DateTime(2013, 7, 9) }, new Pedido { Id =
7, IdCliente = 3, FechaPedido = new DateTime(2013, 10, 1) }, new Pedido { Id =
8, IdCliente = 3, FechaPedido = new DateTime(2013, 11, 8) }, new Pedido { Id =
9, IdCliente = 3, FechaPedido = new DateTime(2013, 11, 22) }, new Pedido { Id =
10, IdCliente = 3, FechaPedido = new DateTime(2013, 11, 29) }, new Pedido { Id =
11, IdCliente = 4, FechaPedido = new DateTime(2013, 10, 19) }, new Pedido { Id =
12, IdCliente = 4, FechaPedido = new DateTime(2013, 11, 11) } }; private static List<LineaPedido> _listaLineasPedido = new List<LineaPedido>() { new LineaPedido() { Id = 1, IdPedido
= 1, IdProducto = 1, Cantidad = 9 }, new LineaPedido() { Id = 2,
IdPedido = 1, IdProducto = 3, Cantidad = 7 }, new LineaPedido() { Id = 3,
IdPedido = 1, IdProducto = 5, Cantidad = 2 }, new LineaPedido() { Id = 4,
IdPedido = 1, IdProducto = 7, Cantidad = 2 }, new LineaPedido() { Id = 5,
IdPedido = 2, IdProducto = 9, Cantidad = 1 }, new LineaPedido() { Id = 6,
IdPedido = 2, IdProducto = 11, Cantidad = 15 }, new LineaPedido() { Id = 7,
IdPedido = 3, IdProducto = 12, Cantidad = 2 }, new LineaPedido() { Id = 8,
IdPedido = 3, IdProducto = 1, Cantidad = 4 }, new LineaPedido() { Id = 9,
IdPedido = 4, IdProducto = 2, Cantidad = 3 }, new LineaPedido() { Id = 10, IdPedido
= 5, IdProducto = 4, Cantidad = 2 }, new LineaPedido() { Id = 11, IdPedido
= 6, IdProducto = 1, Cantidad = 20 }, new LineaPedido() { Id = 12, IdPedido
= 6, IdProducto = 2, Cantidad = 7 }, new LineaPedido() { Id = 13, IdPedido
= 7, IdProducto = 1, Cantidad = 4 }, new LineaPedido() { Id = 14, IdPedido
= 7, IdProducto = 2, Cantidad = 10 }, new LineaPedido() { Id = 15, IdPedido
= 7, IdProducto = 11, Cantidad = 2 }, new LineaPedido() { Id = 16, IdPedido
= 8, IdProducto = 12, Cantidad = 2 }, new LineaPedido() { Id = 17, IdPedido
= 8, IdProducto = 3, Cantidad = 9 }, new LineaPedido() { Id = 18, IdPedido
= 9, IdProducto = 5, Cantidad = 11 }, new LineaPedido() { Id = 19, IdPedido
= 9, IdProducto = 6, Cantidad = 9 }, new LineaPedido() { Id = 20, IdPedido
= 9, IdProducto = 1, Cantidad = 4 }, new LineaPedido() { Id = 21, IdPedido
= 10, IdProducto = 2, Cantidad = 7 }, new LineaPedido() { Id = 22, IdPedido
= 10, IdProducto = 3, Cantidad = 2 }, new LineaPedido() { Id = 23, IdPedido
= 10, IdProducto = 11, Cantidad = 10 }, new LineaPedido() { Id = 24, IdPedido
= 11, IdProducto = 12, Cantidad = 2 }, new LineaPedido() { Id = 25, IdPedido
= 12, IdProducto = 1, Cantidad = 20 } }; //
Propiedades de los elementos privados public static List<Cliente> ListaClientes { get { return _listaClientes; } } public static List<Producto> ListaProductos { get { return _listaProductos; } } public static List<Pedido> ListaPedidos { get { return _listaPedidos; } } public static List<LineaPedido> ListaLineasPedido { get { return _listaLineasPedido; } } } } |
Con esto ya poseeremos un pequeño set de datos sobre el que
operar.